このページはECMAScript® 2020 Language Specification21 Text Processing章をJavaScriptの学習目的で私的に日本語訳したものであり、直訳と意訳および推測が混在しています。そのため内容については正確ではない可能性があります。正確な情報を知りたい場合は、原文をご覧ください。また一部訳者によるコメントが含まれていることがあります。※このサイトの内容で損害や不利益を受けたとしても当方は一切の責任を負いません。

21.1 Stringオブジェクト(String Objects)

21.1.1 Stringコンストラクター(The String Constructor)

Stringコンストラクターは、次のような特徴があります。

  • 組み込みオブジェクト%String%です。
  • グローバルオブジェクトの「String」プロパティの初期値です。
  • コンストラクターとして呼び出されると、新しいStringオブジェクトを作成して初期化します。
  • 関数として呼び出されると型変換を実行します。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターには、[[StringData]]内部スロットとサブクラスインスタンスを作成および初期化するためにStringコンストラクターへのsuperコールを含める必要があります。

21.1.1.1 String ( value )

String が引数 value で呼び出されると、次の手順が実行されます。

  1. value が存在しないなら、 empty String を s とする
  2. 1. と異なるなら、
    1. NewTargetundefinedType(value) が Symbol型 なら、 SymbolDescriptiveString(value) を返す
    2. ? ToString(value) を s とする
  3. NewTargetundefined なら、 s を返す
  4. ! StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")) を返す

21.1.2 Stringコンストラクターのプロパティ(Properties of the String Constructor)

Stringコンストラクターは、次のような特徴があります。

  • [[Prototype]]内部スロットがあり、値が%Function.prototype%であるます。
  • 次のプロパティがあります。

21.1.2.1 String.fromCharCode ( ...codeUnits )

String.fromCharCode関数は、レストパラメーターcodeUnitsを形成する任意の数の引数を使用して呼び出すことができます。 次の手順が実行されます。

  1. 関数に渡された引数ListcodeUnits とする
  2. codeUnits の要素数を length とする
  3. 空の新規Listelements とする
  4. 0 を nextIndex とする
  5. nextIndexlength の間繰り返し
    1. codeUnits[nextIndex] を next とする
    2. ? ToUint16(next) を nextCU とする
    3. nextCUelements の最後に追加する
    4. nextIndex + 1 を nextIndex にセットする
  6. elements内の要素をコードユニットとして順番に並べたString値を返す。 長さが0の場合、空の文字列を返す。

fromCharCode の "length"プロパティは 1 です。

21.1.2.2 String.fromCodePoint ( ...codePoints )

String.fromCodePoint関数は、レストパラメーターcodePointsを形成する任意の数の引数を使用して呼び出すことができます。 次の手順が実行されます。

  1. 関数に渡された引数ListcodePoints とする
  2. codePoints の要素数を length とする
  3. 空の新規Listelements とする
  4. 0 を nextIndex とする
  5. nextIndexlength の間繰り返し
    1. codePoints[nextIndex] を next とする
    2. ? ToNumber(next) を nextCP とする
    3. ! IsInteger(nextCP) が false なら、RangeError例外をスローする
    4. If nextCP < 0 または nextCP > 0x10FFFF なら RangeError例外をスローする
    5. nextCPUTF16Encoding の要素を elements の最後に追加する
    6. nextIndex + 1 を nextIndex にセットする
  6. elements内の要素をコードユニットとして順番に並べたString値を返す。 長さが0の場合、空の文字列を返す。

fromCodePoint の "length"プロパティは 1 です。

21.1.2.3 String.prototype

String.prototypeの初期値は%String.prototype%です。

このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。

21.1.2.4 String.raw ( template, ...substitutions )

String.raw関数は、可変数の引数を使用して呼び出すことができます。 最初の引数はテンプレートで、残りの引数は置換値のリストです。 次の手順が実行されます。

  1. 2番目以降の引数のListsubstitutions とする。2番目以降の引数がないなら、Listは空
  2. substitutions の要素数を numberOfSubstitutions とする
  3. ? ToObject(template) を cooked とする
  4. ? ToObject(? Get(cooked, "raw")) を raw とする
  5. ? LengthOfArrayLike(raw) を literalSegments とする
  6. literalSegments ≦ 0 なら empty String を返す
  7. 空の新規ListstringElements とする
  8. 0 を nextIndex とする
  9. 繰り返す
    1. ! ToString(nextIndex) を nextKey とする
    2. ? ToString(? Get(raw, nextKey)) を nextSeg とする
    3. nextSeg のコードユニット要素を順番に stringElements の最後に追加する
    4. nextIndex + 1 = literalSegments なら、
      1. stringElementsの要素をコードユニットとして順番に並べた String値を返す
    5. nextIndexnumberOfSubstitutions なら substitutions[nextIndex] を next とする
    6. e. と異なるなら、 empty String を next とする
    7. ? ToString(next) を nextSub とする
    8. nextSub の要素を順番にコードユニットとして stringElements の最後に追加する
    9. nextIndex + 1 を nextIndex にセットする
String.rawは、タグ付きテンプレート(12.3.11)のタグ関数として使用することを目的としています。 そのように呼び出されると、最初の引数は整形式のテンプレートオブジェクトになり、残りのパラメーターには置換値が含まれます。

21.1.3 Stringプロトタイプオブジェクトのプロパティ(Properties of the String Prototype Object)

Stringプロトタイプオブジェクトは、次のような特徴があります。

  • 組み込みオブジェクト%StringPrototype%です。
  • Stringエキゾチックオブジェクトであり、指定された内部メソッドがあります。
  • [[StringData]]内部スロットがあり、その値は空の文字列です。
  • "length"プロパティがあります。初期値は0です。属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です
  • [[Prototype]]内部スロットがあり、値は%Object.prototype%です。

特に明記されていない限り、以下で定義されているStringプロトタイプオブジェクトのメソッドは汎用的ではありません。this値は、String値か、String値で初期化された[[StringData]]内部スロットを持つオブジェクトである必要があります。

抽象操作thisStringValue(value)は、次の手順を実行します。

  1. Type(value) が String型 なら、 value を返す
  2. Type(value) が Object型 で value が [[StringData]] 内部スロットを持つなら、
    1. value.[[StringData]] を s とする
    2. Assert: Type(s) は String型
    3. s を返す
  3. TypeError例外をスローする

21.1.3.1 String.prototype.charAt ( pos )

thisオブジェクトを文字列に変換し、インデックスposにあるコードユニットを含む単一要素の文字列を返します。 インデックス位置に要素がない場合、空の文字列を返します。 結果はString値です。Stringオブジェクトではありません。

charAt が引数 pos で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToInteger(pos) を position とする
  4. S の長さを size とする
  5. position < 0 または positionsize なら empty String を返す
  6. Sのインデックスpositionのコードユニットを含む長さ1の文字列値を返す
charAt関数は汎用的です。 this値がStringオブジェクトである必要はありません。 他の種類のオブジェクトでも使用することができます。

21.1.3.2 String.prototype.charCodeAt ( pos )

thisオブジェクトを文字列に変換し、インデックスposにあるコードユニット値(216未満の非負の整数)を返します。 インデックスに要素がない場合、NaNを返します。

charCodeAt が引数 pos で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToInteger(pos) を position とする
  4. S の長さを size とする
  5. position < 0 または positionsize なら、 NaN を返す
  6. 文字列 S 内のインデックス position にあるコードユニット値を数値型の値で返す
charCodeAt関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.3 String.prototype.codePointAt ( pos )

thisオブジェクトを文字列に変換し、インデックスposから始まるUTF-16エンコードコードポイント(6.1.4)のコードポイント値である0x10FFFF以下の非負の整数を返します。 インデックスに要素がない場合、undefinedを返します。 UTF-16サロゲートペアがposで始まらない場合、結果はposのコードユニットになります。

codePointAt が引数 pos で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToInteger(pos) を position とする
  4. S の長さを size とする
  5. position < 0 または positionsize なら undefined を返す
  6. ! CodePointAt(S, position) を cp とする
  7. cp.[[CodePoint]] を返す
codePointAt関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.4 String.prototype.concat ( ...args )

concatメソッドが呼び出されると、thisオブジェクトのコード単位(文字列に変換)と、それに続く文字列に変換された各引数のコード単位で構成される文字列値が返されます。 結果はString値であり、Stringオブジェクトではありません。

concatメソッドが0個以上の引数で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. 関数に渡された引数のListargs とする
  4. SR とする
  5. argsempty でない間繰り返す
    1. args から最初の要素を削除し、その要素を next とする
    2. ? ToString(next) を nextString とする
    3. RnextString の文字列連結を R とする
  6. R を返す

concat method の "length"プロパティは 1 です。

concat 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.5 String.prototype.constructor

String.prototype.constructorの初期値は%String%です。

21.1.3.6 String.prototype.endsWith ( searchString [ , endPosition ] )

次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? IsRegExp(searchString) を isRegExp とする
  4. isRegExptrue なら、TypeError例外をスローする
  5. ? ToString(searchString) を searchStr とする
  6. S の長さを len とする
  7. endPositionundefined なら、 len を、異なるなら ? ToInteger(endPosition) を pos とする
  8. min(max(pos, 0), len) を end とする
  9. searchStr の長さを searchLength とする
  10. end - searchLengthstart とする
  11. start が0未満 なら、 false を返す
  12. sstartから長さsearchLengthのコードユニットシーケンスがsearchStrのコードユニットシーケンスと完全に同じなら、true を返す
  13. false を返す
文字列に変換されたsearchStringのコードユニットシーケンスと、endPosition -length(this) から始まる文字列に変換されたthisオブジェクトのコードユニットシーケンスと同じである場合、trueを返します。 それ以外の場合はfalseを返します。
最初の引数がRegExpの場合に例外をスローするのは、将来的にそのような引数値を許可する拡張機能を定義できるようにするためです。
extendsWith関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用することができます。

21.1.3.7 String.prototype.includes ( searchString [ , position ] )

includes は 二つ の引数 searchStringposition を取り、次の手順を実行します。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? IsRegExp(searchString) を isRegExp とする
  4. isRegExptrue なら、TypeError例外をスローする
  5. ? ToString(searchString) を searchStr とする
  6. ? ToInteger(position) を pos とする
  7. Assert: positionundefined なら、 pos は 0
  8. S の長さを len とする
  9. min(max(pos, 0), len) を start とする
  10. searchStr の長さを searchLen とする
  11. kstart以上の整数で、k + searchLenlen以下とする。jsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、trueを返す。 そのような整数kがない場合は、falseを返す
    ようするに文字列S内に、searchStrがあるかどうか
thisオブジェクトを文字列に変換し、その文字列のインデックスposition以上の位置にsearchStringが含まれている場合、trueを返します。 それ以外の場合は、falseを返します。 positionundefinedの場合0とみなし、文字列全体を検索します。
最初の引数がRegExpの場合に例外をスローしているのは、将来的にそのような引数値を受け付ける拡張機能を定義できるようにするためです。
include関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトで使用することができます。

21.1.3.8 String.prototype.indexOf ( searchString [ , position ] )

searchStringが、thisオブジェクトを文字列に変換した結果の一部に含まれていて、その位置がposition以上のインデックスである場合、最小のインデックスを返します。 それ以外の場合は、-1を返します。 positionundefinedの場合、すべての文字列を検索するために0とみなします。

indexOf は 二つ の引数 searchStringposition を取り、次の手順を実行します。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToString(searchString) を searchStr とする
  4. ? ToInteger(position) を pos とする
  5. Assert: positionundefined なら、 pos は 0
  6. S の長さを len とする
  7. min( max(pos, 0), len) を start とする
  8. searchStr の長さを searchLen とする
  9. kstart以上の整数で、k + searchLenlen以下とする。jsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、最小のkを返す。 そのような整数kがない場合は、値-1を返す
    ようするに文字列S内に、searchStrがあるかどうか
indexOf関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用することができます。

21.1.3.9 String.prototype.lastIndexOf ( searchString [ , position ] )

searchStringが、thisオブジェクトを文字列に変換した結果の一部に含まれていて、その位置がposition以上のインデックスである場合、最大のインデックスを返します。 それ以外の場合は、-1を返します。 positionundefinedの場合、すべての文字列を検索するために文字列値の長さとみなします。

lastIndexOf は 二つ の引数 searchStringposition を取り、次の手順を実行します。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToString(searchString) を searchStr とする
  4. ? ToNumber(position) を numPos とする
  5. Assert: positionundefined なら、 numPosNaN
  6. numPosNaN なら、 +∞ を、異なるなら、! ToInteger(numPos) を pos とする
  7. S の長さを len とする
  8. min( max(pos, 0), len) を start とする
  9. searchStr の長さを searchLen とする
  10. kstart以下の整数で、k + searchLenlen以下とする。jsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、最大のkを返す。 そのような整数kがない場合は、値-1を返す
    ようするに文字列S内に、searchStrがあるかどうか
lastIndexOf関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用することができます。

21.1.3.10 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにlocaleCompareメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、localeCompareメソッドの次の仕様が使用されます。

引数thatを指定してlocaleCompareメソッドを呼び出すと、それぞれ文字列に変換したthis値とthatのロケールに依存した文字列比較の結果を表すNaN以外の数値が返されます。 2つの文字列をSThatとします。 2つの文字列は、実装定義の方法で比較されます。 結果は、ホストのデフォルトロケールで指定された並べ替え順序で文字列値を並べ替えることを目的としており、Sが前に来るか、文字列が等しいか、Sが後に来るかに応じて、負、ゼロ、または正になります。 それぞれソート順です。

比較を実行する前に、次の手順を実行して文字列を準備します。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToString(that) を That とする

このメソッドの2番目と3番目のオプションパラメーターは、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置に他の解釈を割り当ててはなりません。

localeCompareメソッドは、thisとthatの2つの引数の関数と見なされる場合、すべての文字列セットに対する一貫した比較関数(22.1.3.27で定義)です。

実際の戻り値は、実装者が値に追加情報をエンコードできるように実装定義されていますが、関数はすべての文字列の全順序を定義する必要があります。 この関数は、Unicode標準に従って正規に同等である文字列を同一として扱う必要があり、正規に同等と見なされる文字列を比較する場合は0を返す必要があります。

後者は2つの引数の関数を必要とするため、localeCompareメソッド自体はArray.prototype.sortの引数として直接適していません。
この関数は、ホスト環境からECMAScript環境で使用可能な言語依存の比較機能に依存し、ホスト環境の現在のロケールのルールに従って比較することを目的としています。 ただし、ホストが提供する比較機能に関係なく、Unicode標準に従って正規に同等である文字列を同一として扱う必要があります。 この関数は、Unicode互換性の同等性または分解を重要視しないことをお勧めします。 標準的な等価性の定義と説明は、Unicode標準の第2章と第3章、およびUnicode標準の付録#15、Unicode正規化フォーム(https://unicode.org/reports/tr15/)、およびUnicodeテクニカルノート#5 、アプリケーションの正規等価性(https://www.unicode.org/notes/tn5/)を参照してください。 Unicode技術標準#10、Unicode照合アルゴリズム(https://unicode.org/reports/tr10/)も参照してください。
localeCompare関数は汎用的です。 this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用することができます。

21.1.3.11 String.prototype.match ( regexp )

match が引数 regexp で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. regexpundefinednull でないなら、
    1. ? GetMethod(regexp, @@match) を matcher とする
    2. matcherundefined でないなら、
      1. ? Call(matcher, regexp, « O ») を返す
  3. ? ToString(O) を S とする
  4. ? RegExpCreate(regexp, undefined) を rx とする
  5. ? Invoke(rx, @@match, « S ») を返す
match 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.12 String.prototype.matchAll ( regexp )

this値の文字列に対して正規表現のマッチをregexpで実行し、イテレータを返します。 各反復結果の値は、マッチの結果を含むArrayオブジェクトです。マッチしなかった場合はnullです。
次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. regexpundefinednull でないなら、
    1. ? IsRegExp(regexp) を isRegExp とする
    2. isRegExptrue なら、
      1. ? Get(regexp, "flags") を flags とする
      2. ? RequireObjectCoercible(flags) を実行する
      3. ? ToString(flags) に "g" が含まれていないなら TypeError例外をスローする
    3. ? GetMethod(regexp, @@matchAll) を matcher とする
    4. matcherundefined でないなら、
      1. ? Call(matcher, regexp, « O ») を返す
  3. ? ToString(O) を S とする
  4. ? RegExpCreate(regexp, "g") を rx とする
  5. ? Invoke(rx, @@matchAll, « S ») を返す
matchAll関数は汎用的です。this値がStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用することができます。
String.prototype.splitと同様に、String.prototype.matchAllは通常、入力を変更せずに動作するように設計されています。

21.1.3.13 String.prototype.normalize ( [ form ] )

normalize が引数 form で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. formundefined なら、 "NFC"f とする
  4. 3. と異なるなら、 ? ToString(form) を f とする
  5. f"NFC""NFD""NFKC""NFKD" のどれかでないなら、RangeError例外をスローする
  6. Sに対して正規化形式fで正規化した結果の文字列値をnsとする。(https://unicode.org/reports/tr15/参照)
  7. ns を返す
normalize 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.14 String.prototype.padEnd ( maxLength [ , fillString ] )

padEnd メソッドが呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? StringPad(O, maxLength, fillString, end) を返す

21.1.3.15 String.prototype.padStart ( maxLength [ , fillString ] )

padStart メソッドが呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? StringPad(O, maxLength, fillString, start) を返す
21.1.3.15.1 ランタイムセマンティクス(Runtime Semantics): StringPad ( O, maxLength, fillString, placement )

抽象操作StringPadが引数OmaxLengthfillStringplacementを指定して呼び出されると、次の手順が実行されます。

  1. Assert: placementstart または end
  2. ? ToString(O) を S とする
  3. ? ToLength(maxLength) を intMaxLength とする
  4. S の長さを stringLength とする
  5. intMaxLengthstringLength 以下なら、 S を返す
  6. fillStringundefined なら、 コードユニット 0x0020 (SPACE) のみで構成される文字列値を filler とする
  7. 6. と異なるなら、 ? ToString(fillString) を filler とする
  8. fillerempty String なら、 S を返す
  9. intMaxLength - stringLengthfillLen とする
  10. filler の繰り返し連結を長さfillLen で切り捨てた文字列を truncatedStringFiller とする
  11. placementstart なら truncatedStringFillerS の文字列連結を返す
  12. 11. と異なるなら、 StruncatedStringFiller の文字列連結を返す
引数maxLengthは、Sの長さより小さくならないようにクランプされます。
引数fillStringのデフォルトは " "(コードユニット0x0020(SPACE)で構成される文字列値)です。

21.1.3.16 String.prototype.repeat ( count )

次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? ToInteger(count) を n とする
  4. n < 0 なら RangeError例外をスローする
  5. n+∞ なら、RangeError例外をスローする
  6. n が 0 なら、 empty String を返す
  7. Sn回コピーして作成された文字列値を返す
このメソッドは、thisオブジェクトを文字列に変換し、そのコードユニットで構成される文字列値をcount回数繰り返した文字列を作成します。
repeat 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.17 String.prototype.replace ( searchValue, replaceValue )

replaceメソッドが引数searchValuereplaceValueを使用して呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. searchValueundefinednull でないなら、
    1. ? GetMethod(searchValue, @@replace) を replacer とする
    2. replacerundefined でないなら、
      1. ? Call(replacer, searchValue, « O, replaceValue ») を返す
  3. ? ToString(O) を string とする
  4. ? ToString(searchValue) を searchString とする
  5. IsCallable(replaceValue) を functionalReplace とする
  6. functionalReplacefalse なら、
    1. ? ToString(replaceValue) を replaceValue にセットする
  7. stringからsearchStringを検索し、最初に一致した部分文字列の、最初のコードユニットのインデックスをposとし、searchStringmatched とする。 一致しなかった場合は、stringを返す
  8. functionalReplacetrue なら、
    1. ? Call(replaceValue, undefined, « matched, pos, string ») を replValue とする
    2. ? ToString(replValue) を replStr とする
  9. 8. と異なるなら、
    1. 空の新規Listcaptures とする
    2. ! GetSubstitution(matched, string, pos, captures, undefined, replaceValue) を replStr とする
  10. pos + matchedのコードユニット数を tailPos とする
  11. stringの最初のposコードユニットと replStr と、インデックス tailPos から末尾までの部分文字列の文字列連結を newString とする。 posが0の場合、連結の最初の要素は空の文字列である
  12. newString を返す
replace 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。
21.1.3.17.1 ランタイムセマンティクス(Runtime Semantics): GetSubstitution ( matched, str, position, captures, namedCaptures, replacement )

抽象操作GetSubstitution は、次の手順を実行します。

  1. Assert: Type(matched) は String型
  2. matched のコードユニット数を matchLength とする
  3. Assert: Type(str) は String型
  4. str のコードユニット数を stringLength とする
  5. Assert: ! IsNonNegativeInteger(position) は true
  6. Assert: positionstringLength
  7. Assert: capturesemptyの可能性のある文字列のリスト
  8. Assert: Type(replacement) は String型
  9. position + matchLengthtailPos とする
  10. captures の要素数を m とする
  11. 表52で指定された置換を実行しながら、replacementからresult にコードユニット要素をコピーすることによってreplacementから派生した文字列値をresult とする。これらの$置換は左から右に実行される。そのような置換が実行されると、新しい置換が実行される。 新しい置換テキストはそれ以上の置換の対象にはならない
  12. result を返す
表52: 置換テキストシンボル置換
コードユニット ユニコード文字 置換テキスト
0x0024, 0x0024 $$ $
0x0024, 0x0026 $& matched
0x0024, 0x0060 $` positionが0なら、空の文字列です。 それ以外は、strのコードユニットインデックス0から、position-1 までの文字列です。
0x0024, 0x0027 $' tailPosstringLength なら空の文字列です。それ以外の場合、strのコードユニットインデックスtailPosから終わりまでの文字列です。
0x0024, N
Nは次の範囲
0x0031 ≦ N ≦ 0x0039
$n
n1 2 3 4 5 6 7 8 9 どれかで、
その後に10進数が続かない
capturesn番目の要素。nは1桁で、1から9の範囲です。nmで、capturesn番目の要素がundefinedときは、代わりにempty文字列を使用してください。 nmの場合、置換は行われません。
0x0024, N, N
Nは次の範囲
0x0030 ≦ N ≦ 0x0039
$nn
n0 1 2 3 4 5 6 7 8 9 どれか
capturesnn番目の要素。nnは2桁で、01から99の範囲の10進数です。nnmで、キャプチャのnn番目の要素がundefinedときは、代わりにempty文字列を使用してください。 nnが00またはnnmの場合、置換は行われません。
0x0024, 0x003C $<
  1. namedCapturesundefined なら, 置換テキストは "$<"
  2. 1. と異なるなら、
    1. Assert: Type(namedCaptures) は Object型
    2. U+003E ("$<":GREATER-THAN SIGN) までスキャン
    3. 存在しないなら、置換テキストは "$<"
    4. c. と異なるなら、
      1. 囲まれた文字列を groupName とする
      2. ? Get(namedCaptures, groupName) を capture とする
      3. captureundefined なら $<までのテキストをempty文字列に置き換える
      4. iiiでないなら、 $<までのテキストを ? ToString(capture)に置き換える
0x0024 上記のいずれにも一致しないコンテキストでの$ $

21.1.3.18 String.prototype.search ( regexp )

search が引数 regexp で呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. regexpundefinednull でないなら、
    1. ? GetMethod(regexp, @@search) を searcher とする
    2. searcherundefined でないなら、
      1. ? Call(searcher, regexp, « O ») を返す
  3. ? ToString(O) を string とする
  4. ? RegExpCreate(regexp, undefined) を rx とする
  5. ? Invoke(rx, @@search, « string ») を返す
search 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.19 String.prototype.slice ( start, end )

sliceメソッドは、startendの2つの引数を取り、thisオブジェクトを文字列に変換した結果の部分文字列を返します。インデックスstartから始まり、end-1まで実行されます。endundefinedの場合は文字列の終わりまでです。 startが負の場合、sourceLength + startとして扱われます。sourceLengthは文字列の長さです。 endが負の場合、sourceLength + endとして扱われます。 結果はString値であり、Stringオブジェクトではありません。 次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. S の長さを len とする
  4. ? ToInteger(start) を intStart とする
  5. endundefined なら、 len を、異なるなら ? ToInteger(end) を intEnd とする
  6. intStart < 0 なら max(len + intStart, 0) を、異なるなら min(intStart, len) を from とする
  7. intEnd < 0 なら max(len + intEnd, 0) を、異なるなら min(intEnd, len) を to とする
  8. max(to - from, 0) を span とする
  9. sのインデックスfromからspan個のコードユニット文字列を返す
slice 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.20 String.prototype.split ( separator, limit )

thisオブジェクトを文字列に変換した結果の部分文字列が格納されている配列オブジェクトを返します。 部分文字列は、separatorを左から右に検索することによって決定されます。 検索された文字列は、返される配列の部分文字列の一部ではありませんが、文字列値を分割するのに役立ちます。 separatorの値は、任意の長さの文字列にすることも、@@splitメソッドを持つRegExpなどのオブジェクトにすることもできます。

split メソッドが呼び出されると、次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. separatorundefinednull でないなら、
    1. ? GetMethod(separator, @@split) を splitter とする
    2. splitterundefined でないなら、
      1. ? Call(splitter, separator, « O, limit ») を返す
  3. ? ToString(O) を S とする
  4. ! ArrayCreate(0) を A とする
  5. 0 を lengthA とする
  6. limitundefined なら 232 - 1 を、異なるなら ? ToUint32(limit) を lim とする
  7. S の長さを s とする
  8. 0 を p とする
  9. ? ToString(separator) を R とする
  10. lim = 0 なら A を返す
  11. separatorundefined なら、
    1. ! CreateDataPropertyOrThrow(A, "0", S) を実行する
    2. A を返す
  12. s = 0 なら、
    1. SplitMatch(S, 0, R) を z とする
    2. zfalse でないなら、 A を返す
    3. ! CreateDataPropertyOrThrow(A, "0", S) を実行する
    4. A を返す
  13. pq とする
  14. qs の間繰り返し
    1. SplitMatch(S, q, R) を e とする
    2. efalse なら q + 1 を q にセットする
    3. b. と異なるなら、
      1. Assert: e は整数インデックスで s以下
      2. e = p なら q + 1 を q にセットする
      3. ii. と異なるなら、
        1. Sのインデックスpからq-1まのコードユニットで構成される文字列に等しい文字列値をTとする
        2. ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
        3. lengthA + 1 を lengthA にセットする
        4. lengthA = lim なら A を返す
        5. ep にセットする
        6. pq にセットする
  15. Sのインデックスpからs-1のコードユニットで構成される部分文字列に等しい文字列値Tとする
  16. ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
  17. A を返す

separatorの値は空の文字列である可能性があります。 この場合separatorは、入力文字列の最初と最後の空の部分文字列と一致せず、前の区切り文字の最後の空の部分文字列と一致しません。 separatorが空の文字列の場合、文字列は個々のコードユニット要素に分割されます。 結果の配列の長さは文字列の長さと等しく、各部分文字列には1つのコード単位が含まれます。

thisオブジェクトが空の文字列の場合、結果はseparatorが空の文字列と一致するかどうかによって異なります。 可能であれば、結果の配列には要素が含まれていません。 それ以外の場合、結果の配列には空の文字列である1つの要素が含まれます。

separatorundefinedの場合、結果の配列には、文字列に変換したthis値である文字列が1つだけ含まれます。 limitundefinedでない場合、limit数を超える配列インデックスは切り捨てられます。

split 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。
21.1.3.20.1 ランタイムセマンティクス(Runtime Semantics): SplitMatch ( S, q, R )

抽象操作SplitMatchは、文字列S、整数q、文字列Rの3つのパラメーターを取り、falseまたはマッチした終了インデックスを返すために次の手順を実行します。

  1. Assert: Type(R) は String型
  2. R のコードユニット数を r とする
  3. S のコードユニット数を s とする
  4. q + rs なら、 false を返す
  5. 整数iを0からr-1までとして、Sのインデックスq + iのコードユニットとRのインデックスiのコードユニットで異なるものがある場合、falseを返す
  6. q + r を返す

21.1.3.21 String.prototype.startsWith ( searchString [ , position ] )

次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ? IsRegExp(searchString) を isRegExp とする
  4. isRegExptrue なら、TypeError例外をスローする
  5. ? ToString(searchString) を searchStr とする
  6. ? ToInteger(position) を pos とする
  7. Assert: positionundefined なら、 pos は 0
  8. S の長さを len とする
  9. min( max(pos, 0), len) を start とする
  10. searchStr の長さを searchLength とする
  11. searchLength + startlen より大きいなら、 false を返す
  12. Sstartから長さsearchLengthのコードユニットのシーケンスがsearchStrのコードユニットシーケンスと同じである場合、trueを返す
  13. false を返す
このメソッドは、文字列に変換されたsearchStringのコードユニットのシーケンスが、インデックスpositionから始まる文字列に変換されたthisオブジェクトの対応するコードユニットと同じである場合にtrueを返します。 それ以外の場合はfalseを返します。
最初の引数がRegExpの場合に例外をスローするのは、将来的にそのような引数値を許可する拡張機能を定義できるようにするためです。
startsWith 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.22 String.prototype.substring ( start, end )

substringメソッドは、startendの2つの引数を取り、thisオブジェクトを文字列に変換した結果の部分文字列を返します。インデックスのstartから始まり、endまで(endがundefinedなら文字列の終わりまで)実行されます。 結果はString値であり、Stringオブジェクトではありません。

いずれかの引数がNaNまたは負の場合、ゼロに置き換えられます。 いずれかの引数が文字列の長さよりも大きい場合は、文字列の長さに置き換えられます。

startendより大きい場合、それらは交換されます。

次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. S の長さを len とする
  4. ? ToInteger(start) を intStart とする
  5. endundefined なら、 len を、異なるなら ? ToInteger(end) を intEnd とする
  6. min( max(intStart, 0), len) を finalStart とする
  7. min( max(intEnd, 0), len) を finalEnd とする
  8. min(finalStart, finalEnd) を from とする
  9. max(finalStart, finalEnd) を to とする
  10. 長さが to - fromで、Sのコードユニット、つまりインデックスfromからto-1のコードユニットを昇順で含む文字列値を返す
substring 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.23 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにtoLocaleLowerCaseメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、toLocaleLowerCaseメソッドの次の仕様が使用されます。

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

この関数はtoLowerCaseとまったく同じように機能しますが、その結果はロケールに依存しない結果ではありません。ホスト環境の現在のロケールに対して正しい結果を生成することを目的としています。 その言語のルールが通常のUnicodeケースマッピングと競合するいくつかのケース(トルコ語など)でのみ違いがあります。

このメソッドのオプションのパラメーターの意味は、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置を他の目的で使用してはなりません。

toLocaleLowerCase 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.24 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにtoLocaleUpperCaseメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、toLocaleUpperCaseメソッドの次の仕様が使用されます。

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

この関数はtoUpperCaseとまったく同じように機能しますが、その結果はロケールに依存しない結果ではありません。ホスト環境の現在のロケールに対して正しい結果を生成することを目的としています。 その言語のルールが通常のUnicodeケースマッピングと競合するいくつかのケース(トルコ語など)でのみ違いがあります。

このメソッドのオプションのパラメーターの意味は、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置を他の目的で使用してはなりません。

toLocaleUpperCase 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.25 String.prototype.toLowerCase ( )

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。 次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. ! UTF16DecodeString(S) を sText とする
  4. Unicodeの既定の大文字小文字変換アルゴリズムに従ったtoLowercase(sText)の結果を lowerText とする
  5. ! UTF16Encode(lowerText) を L とする
  6. L を返す

結果はUnicode文字データベースのロケールに依存しない大文字と小文字のマッピングに従って、導出する必要があります(これにはUnicodeData.txtファイルだけでなく、それに付随するSpecialCasings.txtファイルのすべてのロケールに依存しないマッピングが明示的に含まれます)。

一部のコードポイントの大文字と小文字のマッピングで、複数のコードポイントが生成される場合があります。 この場合、結果はソースの文字列と同じ長さではない可能性があります。 toUpperCaseとtoLowerCaseはどちらも状況依存の動作をするため、関数は対称的ではありません。 つまり、s.toUpperCase().toLowerCase()が必ずs.toLowerCase()と同じとは限りません。
toLowerCase 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.26 String.prototype.toString ( )

toString メソッドが呼び出されると、次の手順が実行されます。

  1. ? thisStringValue(this値) を返す
StringオブジェクトのtoStringメソッドは、valueOfメソッドと同じ結果を返します。

21.1.3.27 String.prototype.toUpperCase ( )

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

この関数は、StringがUnicodeの既定の大文字小文字変換アルゴリズムのtoUppercaseアルゴリズムを使用してマップされることを除いて、String.prototype.toLowerCaseとまったく同じように動作します。

toUpperCase 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.28 String.prototype.trim ( )

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

次の手順が実行されます。

  1. this値 を S とする
  2. ? TrimString(S, start+end) を返す
trim 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。
21.1.3.28.1 ランタイムセマンティクス(Runtime Semantics): TrimString ( string, where )

抽象演算TrimStringは、引数stringwhereを使用して呼び出され、6.1.4で説明されているように、String値文字列をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

次の手順を実行します。

  1. ? RequireObjectCoercible(string) を str とする
  2. ? ToString(str) を S とする
  3. wherestart なら、 先頭の空白が削除されたSのコピー文字列値を T とする
  4. 3. と異なり whereend なら、末尾の空白が削除されたSのコピー文字列値を T とする
  5. 4. と異なるなら、
    1. Assert: wherestart+end
    2. 先頭と末尾の空白が削除されたSのコピー文字列値を T とする
  6. T を返す

空白の定義は、WhiteSpaceLineTerminatorの両方です。 UnicodeコードポイントがUnicode一般カテゴリ"Space_Separator"("Zs")にあるかどうかを判断する場合、コードユニットシーケンスは、6.1.4で指定されているUTF-16エンコードコードポイントシーケンスとして解釈されます。

21.1.3.29 String.prototype.trimEnd ( )

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

次の手順が実行されます。

  1. this値 を S とする
  2. ? TrimString(S, end) を返す
thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.30 String.prototype.trimStart ( )

この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。

次の手順が実行されます。

  1. this値 を S とする
  2. ? TrimString(S, start) を返す
trimStart 関数は汎用的です。 thisがStringオブジェクトである必要はありません。 したがって、他の種類のオブジェクトでも使用できます。

21.1.3.31 String.prototype.valueOf ( )

valueOf メソッドが呼び出されると、次の手順が実行されます。

  1. ? thisStringValue(this値) を返す

21.1.3.32 String.prototype [ @@iterator ] ( )

@@iteratorメソッドが呼び出されると、String値のコードポイントを反復処理するIteratorオブジェクト(25.1.1.2)が返されます。

次の手順が実行されます。

  1. ? RequireObjectCoercible(this値) を O とする
  2. ? ToString(O) を S とする
  3. CreateStringIterator(S) を返す

この関数の"name"プロパティの値は"[Symbol.iterator]"です。

21.1.4 Stringインスタンスのプロパティ(Properties of String Instances)

StringインスタンスはStringエキゾチックオブジェクトのため、固有の内部メソッドがあります。 Stringインスタンスは、Stringプロトタイプオブジェクトからプロパティを継承します。 Stringインスタンスには、[[StringData]]内部スロットがあります。

Stringインスタンスには、"length"プロパティと、整数インデックス名を持つ列挙可能なプロパティのセットがあります。

21.1.4.1 length

このStringオブジェクトによって表されるString値の要素の数。

一度Stringオブジェクトが初期化されると、このプロパティは変更されません。 属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。

21.1.5 Stringイテレータオブジェクト(String Iterator Objects)

Stringイテレータはオブジェクトであり、特定のStringインスタンスオブジェクトに対する特定の反復を表します。 Stringイテレータオブジェクトの名前付きコンストラクターはありません。 代わりに、Stringイテレータオブジェクトは、Stringインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

21.1.5.1 CreateStringIterator ( string )

Stringオブジェクトのいくつかのメソッドは、Iteratorオブジェクトを返します。 引数文字列を使用した抽象操作CreateStringIteratorは、このようなイテレータオブジェクトを作成するために使用されます。 次の手順を実行します。

  1. Assert: Type(string) は String型
  2. OrdinaryObjectCreate(%StringIteratorPrototype%, « [[IteratedString]], [[StringNextIndex]] ») を iterator とする
  3. stringiterator.[[IteratedString]] にセットする
  4. 0 を iterator.[[StringNextIndex]] にセットする
  5. iterator を返す

21.1.5.2 The %StringIteratorPrototype% Object

%StringIteratorPrototype%は、次のような特徴があります。

  • すべてのStringイテレータオブジェクトに継承されるプロパティがあります。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
  • 以下のプロパティがあります。
21.1.5.2.1 %StringIteratorPrototype%.next ( )
  1. this値 を O とする
  2. Type(O) が Object型 でないなら、TypeError例外をスローする
  3. O が Stringイテレータインスタンス(21.1.5.3<\a>)のすべての内部スロットを持っていないなら、 TypeError例外をスローする
  4. O.[[IteratedString]] を s とする
  5. sundefined なら、 CreateIterResultObject(undefined, true) を返す
  6. O.[[StringNextIndex]] を position とする
  7. s の長さを len とする
  8. positionlen なら、
    1. undefinedO.[[IteratedString]] にセットする
    2. CreateIterResultObject(undefined, true) を返す
  9. ! CodePointAt(s, position) を cp とする
  10. sのインデックスpositionから長さcp.[[CodeUnitCount]]の連続するコードユニットを含む文字列値を resultString とする
  11. position + cp.[[CodeUnitCount]] を O.[[StringNextIndex]] にセットする
  12. CreateIterResultObject(resultString, false) を返す
21.1.5.2.2 %StringIteratorPrototype% [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"String Iterator"です。

このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}です。

21.1.5.3 Stringイテレータインスタンスのプロパティ(Properties of String Iterator Instances)

Stringイテレータインスタンスは、%StringIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクト
です。 Stringイテレータインスタンスは、最初に表53にリストされている内部スロットを使用して作成されます。

表53: Stringイテレータインスタンスの内部スロット
内部スロット 内容
[[IteratedString]] コードユニットが繰り返されている文字列値。
[[StringNextIndex]] このイテレータによって検査される次の文字列要素(コードユニット)の整数インデックス。

21.2 RegExp(正規表現)オブジェクト(RegExp (Regular Expression) Objects)

RegExpオブジェクトには、正規表現と関連するフラグが含まれています。

正規表現の形式と機能は、Perl5プログラミング言語の正規表現機能をモデルにしています。

21.2.1 パターン(Patterns)

RegExpコンストラクターは、次の文法を入力パターン文字列に適用します。 文法が文字列をPatternの拡張として解釈できない場合、エラーが発生します。

構文:

Pattern[U, N] ::

Disjunction[?U, ?N]

Disjunction[U, N] ::

Alternative[?U, ?N]
Alternative[?U, ?N] |Disjunction[?U, ?N]

Alternative[U, N] ::

Alternative[?U, ?N] Term[?U, ?N]

Term[U, N] ::

Assertion[?U, ?N]
Atom[?U, ?N]

Assertion[U, N] ::

^
$
\b
\B
(?=Disjunction[?U, ?N] )
(?!Disjunction[?U, ?N] )
(?<=Disjunction[?U, ?N] )
(?<!Disjunction[?U, ?N] )

Atom[U, N] ::

.
\AtomEscape[?U, ?N]
(?:Disjunction[?U, ?N] )

SyntaxCharacter :: どれかひとつ

^$\.*+?()[]{}|

ControlEscape :: どれかひとつ

fnrtv

ControlLetter :: どれかひとつ

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

RegExpIdentifierPart[U] ::

$
[~U]UnicodeLeadSurrogate UnicodeTrailSurrogate
<ZWNJ>
<ZWJ>

UnicodeLeadSurrogate ::

範囲内の任意のUnicodeコードポイント
UnicodeTrailSurrogate
範囲内の任意のUnicodeコードポイント

u LeadSurrogate との対応があいまいな \u TrailSurrogateは、対応する \u TrailSurrogate がない最も近い u LeadSurrogate に関連付けられるものとします。

LeadSurrogate ::

Hex4Digits Hex4DigitsSV が 0xD800 から 0xDBFF の範囲内

TrailSurrogate ::

Hex4Digits Hex4DigitsSV が 0xDC00 から 0xDFFF の範囲内

NonSurrogate ::

Hex4Digits Hex4DigitsSV が 0xD800から0xDFFFの範囲外

CharacterClass[U] ::

[[lookahead^]ClassRanges[?U] ]
[^ClassRanges[?U] ]

ClassAtomNoDash[U] ::

SourceCharacter \ または ] または -

21.2.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)

  • DecimalEscapeCapturingGroupNumberNcapturingParens21.2.2.1)より大きいなら、構文エラー
  • 最初のClassAtomIsCharacterClasstrueであるか、2番目のClassAtomIsCharacterClasstrueの場合、構文エラー
  • 最初のClassAtomIsCharacterClassfalseで、2番目のClassAtomIsCharacterClassがfalseで、最初のClassAtomCharacterValueが2番目のClassAtomCharacterValueより大きい場合、構文エラー
  • RegExpUnicodeEscapeSequenceCharacterValueが、"$""_" のコードポイント値、またはUnicodeIDStartレキシカル文法プロダクションと一致するコードポイントでない場合は、構文エラー

RegExpIdentifierStart[U] ::

UnicodeLeadSurrogate UnicodeTrailSurrogate
  • UnicodeLeadSurrogateとUnicodeTrailSurrogateがそれぞれ一致する2つのコードポイントでUTF16DecodeSurrogatePairを実行した結果が、UnicodeIDStartレキシカル文法プロダクションと一致しない場合は構文エラー
  • RegExpUnicodeEscapeSequenceCharacterValue"$""_"のコードポイント値、またはUnicodeIDContinueレキシカル文法プロダクションと一致するコードポイントでない場合は、構文エラー

RegExpIdentifierPart[U] ::

UnicodeLeadSurrogate UnicodeTrailSurrogate
  • UnicodeLeadSurrogateとUnicodeTrailSurrogateがそれぞれ一致する2つのコードポイントでUTF16DecodeSurrogatePairを実行した結果が、UnicodeIDContinueレキシカル文法プロダクションと一致しない場合は構文エラー
  • UnicodePropertyNameSourceTextであるUnicodeコードポイントのリストが、表55の「プロパティ名とエイリアス」列にリストされているUnicodeプロパティ名またはプロパティエイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー
  • UnicodePropertyValueのSourceTextであるUnicodeコードポイントのリストが、対応する表の表57または表58の「プロパティ値とエイリアス」列でリストされた UnicodePropertyNameSourceTextによって指定されたUnicodeプロパティまたはプロパティエイリアスの値または値エイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー
  • LoneUnicodePropertyNameOrValueSourceTextであるUnicodeコードポイントのリストが、表57の「プロパティ値とエイリアス」列にリストされているUnicode一般カテゴリまたは一般カテゴリエイリアス、または表56の「プロパティ名とエイリアス」列にリストされているバイナリプロパティまたはバイナリプロパティエイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー

21.2.1.2 静的セマンティクス(Static Semantics): CapturingGroupNumber

  1. NonZeroDigitMV数値 を返す
  1. code points in DecimalDigits の コードポイントの 数学的整数 値を n とする
  2. ( NonZeroDigitMV × 10n + DecimalDigitsMV ) の数値 を返す

NonZeroDigitMV」と「DecimalDigitsMV」の定義は11.8.3にあります。

21.2.1.3 静的セマンティクス(Static Semantics): IsCharacterClass

ClassAtom ::

-

ClassAtomNoDash ::

SourceCharacter \ または ] または -
  1. false を返す
  1. true を返す

21.2.1.4 静的セマンティクス(Static Semantics): CharacterValue

ClassAtom ::

-
  1. コードポイント値 U+002D (HYPHEN-MINUS) を返す

ClassAtomNoDash ::

SourceCharacter \ または ] または -
  1. SourceCharacter に一致するコードポイントを ch とする
  2. コードポイント値 ch を返す
  1. コードポイント値 U+0008 (BACKSPACE) を返す
  1. コードポイント値 U+002D (HYPHEN-MINUS) を返す
  1. 表54に従ってコードポイント値を返す
表54: ControlEscapeコードポイント値
ControlEscape コードポイント値 コードポイント ユニコード名 シンボル
t 9 U+0009 CHARACTER TABULATION <HT>
n 10 U+000A LINE FEED (LF) <LF>
v 11 U+000B LINE TABULATION <VT>
f 12 U+000C FORM FEED (FF) <FF>
r 13 U+000D CARRIAGE RETURN (CR) <CR>
  1. ControlLetter に一致するコードポイントを ch とする
  2. ch のコードポイント値を i とする
  3. i を32で割った余りを返す
  1. コードポイント値 U+0000 (NULL) を返す
\0文字を表し、その後に10進数を続けることはできません。
  1. HexEscapeSequenceSV のコードユニットの数値を返す
  1. LeadSurrogateCharacterValuelead とする
  2. TrailSurrogateCharacterValuetrail とする
  3. UTF16DecodeSurrogatePair(lead, trail) を cp とする
  4. コードポイント値 cp を返す
  1. LeadSurrogateCharacterValue を返す
  1. TrailSurrogateCharacterValue を返す
  1. NonSurrogateCharacterValue を返す
  1. Hex4DigitsMV数値を返す
  1. CodePointMV数値を返す
  1. HexDigitsMV数値を返す
  1. IdentityEscape に一致するコードポイントを ch とする
  2. コードポイント値 ch を返す

21.2.1.5 静的セマンティクス(Static Semantics): SourceText

  1. プロダクションに一致するソーステキスト内のUnicodeコードポイントのリストをソーステキスト順に返す

21.2.1.6 静的セマンティクス(Static Semantics): StringValue

  1. RegExpIdentifierName一致するソーステキストidText とする
  2. idText内の\ RegExpUnicodeEscapeSequence を、RegExpUnicodeEscapeSequence で表されるコードポイントに置き換えた結果を idTextUnescaped とする
  3. ! UTF16Encode(idTextUnescaped) を返す

21.2.2 パターンセマンティクス(Pattern Semantics)

正規表現パターンは、以下に説明するプロセスで抽象クロージャに変換されます。 実装では、結果が同じであるという条件で、この仕様よりも効率的なアルゴリズムを使用することをお勧めします。 抽象クロージャは、RegExpオブジェクトの[[RegExpMatcher]]内部スロットの値として使用されます。

フラグにuが含まれているかどうかで、Patternは、BMPパターンまたはUnicodeパターンのいずれかになります。 BMPパターンは、Basic Multilingual Planeの範囲内のUnicodeコードポイントである16ビット値のシーケンスで構成されている文字列と一致します。 Unicodeパターンは、UTF-16を使用してエンコードされたUnicodeコードポイントで構成されている文字列と一致します。 BMPパターンの動作を説明では、「文字」は単一の16ビットUnicode BMP コードポイントを意味します。 Unicodeパターンでは、「文字」はUTF-16でエンコードされたコードポイント(6.1.4)を意味します。 どちらの場合も、「文字値」とは、対応するエンコードされていないコードポイントの数値を意味します。

Patternの構文とセマンティクスは、PatternのソースコードがSourceCharacter値のリストであるかのように定義されます。各SourceCharacterはUnicodeコードポイントに対応します。 BMPパターンに非BMP SourceCharacter
が含まれている場合、パターン全体がUTF-16を使用してエンコードされ、そのエンコードの個々のコードユニットがリストの要素として使用されます。

例:ソーステキスト上パターンを単一の非BMP文字 U+1D11E(MUSICAL SYMBOL G CLEF)とする。

Unicodeパターンとして解釈されると、単一のコードポイント0x1D11Eで構成される単一の要素(文字)リストになります。 ただし、BMPパターンとして解釈されるため、最初にUTF-16でエンコードされ、コードユニット0xD8340xDD1Eで構成される2要素のリストが生成されます。

パターンは、非BMP文字がUTF-16でエンコードされたECMAScript文字列値としてRegExpコンストラクターに渡されます。 たとえば、文字列値として表される単一文字のMUSICAL SYMBOL G CLEFパターンは、要素がコードユニット0xD834および0xDD1Eである長さ2の文字列です。 したがって、2つのパターン文字で構成されるBMPパターンとして文字列を処理するために、文字列をさらに変換する必要はありません。 ただし、Unicodeパターンとして処理するには、UTF16DecodeSurrogatePairを使用して、単一のパターン文字であるコードポイントU+1D11Eで構成されるリストを作成する必要があります。

実装上では、実際にはUTF-16との間でそのような変換を実行しない場合があります。しかし、この仕様のセマンティクスでは、パターンマッチングの結果において、このような変換が実行された状態である必要があります。

21.2.2.1 表記(Notation)

以下の説明では、次の変数を使用しています。

  • Input:正規表現パターンと一致する文字列のすべての文字を順番に含むリストです。各文字は、関連するパターンの種類に応じて、コードユニットまたはコードポイントのいずれかになります。 Input[n]という表記は、Inputn番目の文字を意味します。nの範囲は0からInputLength-1までです。
  • InputLengthInputの文字数です。
  • NcapturingParens:パターン内の左側をキャプチャする括弧の総数(つまり、Atom :: ( GroupSpecifier Disjunction
    ) 解析ノードの総数)です。左をキャプチャする括弧は、任意の(Atom :: ( GroupSpecifier Disjunction) の終端記号) プロダクションと一致するパターン文字です。
  • DotAll:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"s"が含まれている場合はtrue、それ以外の場合はfalseです。
  • IgnoreCase:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"i"が含まれている場合はtrue、それ以外の場合はfalseです。
  • Multiline:正規表現オブジェクトの[[OriginalFlags]]内部スロットに"m"が含まれている場合はtrue、それ以外の場合はfalseです。
  • Unicode:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"u"が含まれている場合はtrue、それ以外の場合はfalseです。

また、次の内部データ構造を使用しています。

  • CharSet:Unicodeフラグの状態に応じて、コードユニットまたはコードポイントのいずれかの数学的な文字セットです。 「すべての文字」とは、Unicodeの状態に応じて、すべてのコードユニット値またはすべてのコードポイント値のいずれかを意味します。
  • State:順序のあるペア(endIndex,captures)です。endIndexは整数、capturesNcapturingParens値のリストです。Stateは、正規表現マッチングアルゴリズムで部分一致状態を表すために使用されます。 endIndexは、パターンがこれまでに一致した最後の入力文字のインデックスに1を加えたものです。capturesは括弧をキャプチャした結果を保持します。キャプチャのn番目の要素は、取得された値を表すリストです。ただし、キャプチャ未取得時はundefinedです。バックトラックのため、マッチング処理中は複数のStateが使用されている可能性があります。
  • MatchResult:一致が失敗したことを示すState、または特別なトークンのfailureのどちらかです。
  • Continuation:1つのState引数を取り、結果としてMatchResultを返す抽象クロージャです。 Continuationは、State引数で指定された中間状態から開始して、パターンの残りの部分(クロージャーのキャプチャされた値で指定)をInputと照合します。一致した場合、Continuationは到達した最終Stateを返します。一致がしなかった場合、Continuationfailureを返します。
  • MatcherStateContinuationの2つの引数を取り、MatchResultの結果を返す抽象クロージャです。State引数で指定された中間状態から開始して、パターンの中央のサブパターン(クロージャーのキャプチャされた値で指定)を入力と照合します。引数Continuationは、パターンの残りの部分と一致するクロージャです。パターンのサブパターンを照合して新しいStateを取得後、Matcherはその新しいStateContinuationを呼び出して、パターンの残りの部分も一致するかどうかをテストします。可能であれば、MatcherContinuationによって返されたStateを返します。そうでない場合、Matcherは選択ポイントでさまざまな選択を試み、成功するかすべての可能性が尽きるまでContinuationを繰り返し呼び出します。

21.2.2.2 パターン(Pattern)

次のプロダクションは、下記のアルゴリズムで評価します。

  1. Matcherm を取得するために、引数directionとして+1を使用してDisjunctionを評価する
  2. mをキャプチャし、パラメータ(str,index)で呼び出されると次の手順を実行する新しい抽象クロージャを返す
    1. Assert: Type(str) は String型
    2. Assert: ! IsNonNegativeInteger(index) は trueindexstrの長さ
    3. Unicodetrue なら、! UTF16DecodeString(str) のコードポイントのシーケンスで構成されるリストを Input とする。 それ以外なら、strの要素であるコードユニットのシーケンスで構成されるリストを Input とする。Inputは、21.2.2のアルゴリズム全体で使用される。 Inputの各要素は文字と見なされる
    4. Input の文字数を InputLength とする。この変数は21.2.2のアルゴリズム全体で使用される
    5. strの要素indexから取得した文字のInputへのインデックスを listIndex とする
    6. 何もキャプチャせず、呼び出されたときに次の手順を実行するパラメータ(y)を持つ新しいContinuationc とする
      1. Assert: yState
      2. y を返す
    7. NcapturingParensundefined値のリストを cap とする。NcapturingParensから1のインデックスが付けられる
    8. State (listIndex, cap) を x とする
    9. m(x, c) を呼び出し、結果を返す
パターンは、抽象クロージャ値に対して評価("compiles")します。 次にRegExpBuiltinExecは、このプロシージャを文字列と文字列内のオフセットに適用して、文字列内のそのオフセットからパターンが一致するかどうかを判断します。一致する場合は、キャプチャする括弧の値を決定します。 21.2.2のアルゴリズムは、パターンをコンパイルするとSyntaxError例外がスローされるように設計されています。 一方、パターンが正常にコンパイルされ、結果の抽象クロージャを適用して文字列内の一致を見つけると、例外をスローできません(メモリ不足などのどこでも発生する可能性のあるホスト定義の例外を除く)。

21.2.2.3 Disjunction

引数 direction を使用。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数directionを使用してAlternativeを評価し、Matcher m を取得する
  2. m を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数directionを使用してAlternativeを評価し、Matcher m1 を取得する
  2. 引数directionを使用してDisjunctionを評価し、Matcher m2 を取得する
  3. m1m2をキャプチャし、パラメータ(x,c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. m1(x, c) をコールし、その結果を r とする
    4. rfailure でないなら、 r を返す
    5. m2(x, c) をコールし、その結果を返す

| 正規表現演算子は、2つの選択肢を分離します。 パターンは最初に左側のAlternativeと一致するか検証します(その後に正規表現の続きが続きます)。 失敗した場合は、右側のDisjunctionと一致するか検証します(正規表現の続きが続きます)。 左側のAlternative、右側のDisjunction、および続きにすべて選択ポイントがある場合、左側の選択肢の次の選択肢に進む前に、後続のすべての選択肢が試されます。 左側のAlternativeの選択肢がなくなった場合、左側のAlternativeの代わりに右側のDisjunctionが試行されます。 | によってスキップされたパターン内のキャプチャ括弧は、文字列ではなくundefined値を生成します。

例えば、次のようなコードがあるとします。

/a|ab/.exec("abc")

この結果は、"ab" ではなく"a" です。

また、次のようなコードがあるとします。

/((a)|(ab))((c)|(bc))/.exec("abc")

これは、次のような配列を返します。

["abc", "a", "a", undefined, "bc", undefined, "bc"]

次のようには、なりません。

["abc", "ab", undefined, "ab", "c", "c", undefined]

2つの選択肢の検証順序は、direction値と無関係です。

21.2.2.4 Alternative

引数 direction を使用。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. c(x) をコールし、その結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数directionを使用してAlternative を評価し、Matcher m1を取得する
  2. 引数directionを使用してTerm を評価し、Matcher m2を取得する
  3. direction が +1 と等しいなら、
    1. m1m2 をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
      1. Assert: xState
      2. Assert: cContinuation
      3. cm2 をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
        1. Assert: yState
        2. m2(y, c) をコールし、その結果を返す
      4. m1(x, d) をコールし、その結果を返す
  4. 4. と異なるなら、
    1. Assert: direction は -1 と等しい
    2. m1m2 をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
      1. Assert: xState
      2. Assert: cContinuation
      3. cm1 をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
        1. Assert: yState
        2. m1(y, c) をコールし、その結果を返す
      4. m2(x, d) をコールし、その結果を返す
連続するTermは、Inputの連続する部分を同時に一致させようとします。 directionが+1で、左のAlternative、右のTerm、および正規表現の続編のすべてに選択ポイントがある場合、続編のすべての選択肢は、右側のTermの次の選択肢に進む前に試行され、右側のTermのすべての選択肢は、左側のAlternativeの次の選択肢に進む前に試行されます。 directionが-1の場合、AlternativeTermの評価順序が逆になります。

21.2.2.5 Term

引数 direction を使用。

次のプロダクションは、以下のアルゴリズムで評価します。

次のように評価します。

  1. Assertion を評価した結果であるMatcherを返す
結果のMatcherdirectionに依存しません。

次のプロダクションは、以下のアルゴリズムで評価します。

Term ::

  1. 引数directionAtomを評価した結果であるMatcherを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数directionを使用してAtom を評価し、Matcher mを取得する
  2. Quantifierを評価して、整数min、整数(または∞)max、およびブール型greedyの3つの結果を取得する
  3. Assert: max が有限なら、 maxmin 以上
  4. Termの左側にある正規表現全体の左側をキャプチャする括弧の数を、parenIndexとする。 これは、この用語の前またはそれを囲むAtom :: (GroupSpecifier Disjunction )解析ノードの総数
  5. Atomの左側をキャプチャする括弧の数をparenCountとする。 これは、Atomで囲まれたAtom :: (GroupSpecifier Disjunction )解析ノードの総数
  6. mminmaxgreedyparenIndexparenCount をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. RepeatMatcher(m, min, max, greedy, x, c, parenIndex, parenCount) をコールし、その結果を返す
21.2.2.5.1 ランタイムセマンティクス(Runtime Semantics): RepeatMatcher ( m, min, max, greedy, x, c, parenIndex, parenCount )

抽象演算RepeatMatcherは、Matcher m、整数 min、整数(または∞)max、ブール greedyState xContinuationc 、整数 parenIndex、整数 parenCount の8つのパラメーターを取り、次の手順を実行します。 :

  1. max がゼロなら、 c(x) を返す
  2. mminmaxgreedyxcparenIndexparenCount をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
    1. Assert: yState
    2. min がゼロで yendIndexxendIndex と等しいなら、 failure を返す
    3. min がゼロなら ゼロを、異なるなら min - 1 を min2 とする
    4. max が ∞ なら、 ∞を、異なるなら max - 1 を max2 とする
    5. RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) をコールし、その結果を返す
  3. xcaptures リストのコピーを cap とする
  4. parenIndexk and kparenIndex + parenCount の条件を満たす全ての 整数 x について、 undefinedcap[k] にセットする
  5. xendIndexe とする
  6. State値 (e, cap) を xr とする
  7. min がゼロでないなら、 m(xr, d) を返す
  8. greedyfalse なら、
    1. c(x) をコールし、その結果を z とする
    2. zfailure でないなら、 z を返す
    3. m(xr, d) をコールし、その結果を返す
  9. m(xr, d) をコールし、 その結果を z とする
  10. zfailure でないなら、 z を返す
  11. c(x) をコールし、その結果を返す
Atomとそれに続くQuantifierは、Quantifierで指定された回数繰り返されます。 Quantifierが、貪欲でない(Non-greedy)場合、Atomパターンは、後続と一致している間、可能な限り繰り返されます。貪欲(greedy)である場合、Atomパターンは、後続が一致している間、可能な限り繰り返されます。一致する入力文字シーケンスではなく、Atomパターンが繰り返されます。そのため、Atomの異なる繰り返しは、異なる入力部分文字列に一致する可能性があります。

Atomと正規表現の後続すべてに選択ポイントがある場合、Atomは最初に可能な限り多くの(貪欲でない場合は少ない)回数一致します。 後続のすべての選択肢は、Atomの最後の繰り返しで次の選択肢に進む前に試行されます。 Atomの最後(n番目)の繰り返しのすべての選択は、Atomの最後から2番目(n-1)回目の繰り返しの次の選択に進む前に試行されます。 その時点で、Atomの繰り返しが多かれ少なかれ可能になることが判明する可能性があります。 これらは、Atomの(n-1)回目の繰り返しで次の選択肢に進む前に(ここでも、できるだけ少ないか、できるだけ多くから始めて)使い果たされます。

例:

/a[a-z]{2,4}/.exec("abcdefghi")

上の例は、"abced" を返します。

/a[a-z]{2,4}?/.exec("abcdefghi")

上の例は、"abc" を返します。

例:

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

上の例は選択ポイントの順番で、次の配列を返します。

["aaba", "ba"]

次のようにはなりません。

["aabaac", "aabaac"]
["aabaac", "c"]

上記の選択ポイントの順序を使用して、2つの数値(1進表記で表される)の最大公約数を計算する正規表現を記述できます。 次の例では、10と15の公約数を計算します。

"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")

これは、最大公約数を1進表記"aaaaa"で返します。

RepeatMatcherのステップ4は、Atomが繰り返されるたびにAtomのキャプチャをクリアします。 正規表現でその動作を確認できます

/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")

上の例は、配列を返します。

["zaacbbbcac", "z", "ac", "a", undefined, "c"]

次のようにはなりません。

["zaacbbbcac", "z", "ac", "a", "bbb", "c"]

これは、最も外側の*を繰り返すたびに、定量化されたAtomに含まれるすべてのキャプチャされた文字列がクリアされるためです。この場合、2、3、4、および5の番号が付けられたキャプチャ文字列が含まれます。

RepeatMatcherのステップ2.aにより、最小繰り返し数が満たされると、空の文字シーケンスに一致するAtomの拡張は、それ以上の繰り返しとは見なされません。 これにより、正規表現エンジンが次のようなパターンで無限ループに陥るのを防ぎます。

例:

/(a*)*/.exec("b")

もっと複雑な例:

/(a*)b\1+/.exec("baaaac")

これは、次の配列を返します。

["b", ""]

21.2.2.6 Assertion

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

^
  1. 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xendIndexe とする
    4. e がゼロまたは Multilinetrue で、 Input[e - 1] が LineTerminator の一つなら、
      1. c(x) をコールし、その結果を返す
    5. failure を返す
パターンでyフラグが使用されている場合でも、^は常に入力の先頭、またはMultilinetrueの場合、行の先頭でのみ一致します。

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

$
  1. 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xendIndexe とする
    4. eInputLength と等しい、 または Multilinetrue で、 Input[e] が LineTerminator の一つなら、
      1. c(x) をコールし、その結果を返す
    5. failure を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

\b
  1. 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xendIndexe とする
    4. IsWordChar(e - 1) をコールし、 その結果(真偽値)を a とする
    5. IsWordChar(e) をコールし、 その結果(真偽値)を b とする
    6. atrue で、 bfalse または afalsebtrue なら、
      1. c(x) をコールし、その結果を返す
    7. failure を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

\B
  1. 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xendIndexe とする
    4. IsWordChar(e - 1) をコールし、その結果(真偽値)を a とする
    5. IsWordChar(e) をコールし、その結果(真偽値)を b とする
    6. atrue で、 btrue または afalsebfalse なら、
      1. c(x) をコールし、その結果を返す
    7. failure を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数 direction として +1 を使用して Disjunctionを評価し、Matcherを取得する
  2. m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. 何もキャプチャせず、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
      1. Assert: yState
      2. y を返す
    4. m(x, d) をコールし、その結果を r とする
    5. rfailure なら、 failure を返す
    6. rStatey とする
    7. ycaptures リスト を cap とする
    8. xendIndexxe とする
    9. State値 (xe, cap) を z とする
    10. c(z) をコールし、その結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数 direction として +1 を使用して Disjunction を評価し、 Matcher m を取得する
  2. m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. 何もキャプチャせず、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
      1. Assert: yState
      2. y を返す
    4. m(x, d) をコールし、その結果を r とする
    5. rfailure でないなら、 failure を返す
    6. c(x) をコールし、その結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

(?<=Disjunction )
  1. 引数 direction として -1 を使用し Disjunction を評価して Matcher m を取得する
  2. m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. 何もキャプチャせず、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
      1. Assert: yState
      2. y を返す
    4. m(x, d) をコールし、その結果を r とする
    5. rfailure なら、 failure を返す
    6. rStatey とする
    7. ycaptures リスト を cap とする
    8. xendIndexxe とする
    9. State値 (xe, cap) を z とする
    10. c(z) をコールし、その結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Assertion ::

(?<!Disjunction )
  1. 引数 direction として -1 を使用し Disjunction を評価して Matcher m を取得する
  2. m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. 何もキャプチャせず、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
      1. Assert: yState
      2. y を返す
    4. m(x, d) をコールし、その結果を r とする
    5. rfailure でないなら、 failure を返す
    6. c(x) をコールし、その結果を返す
21.2.2.6.1 ランタイムセマンティクス(Runtime Semantics): WordCharacters ( )

抽象操作WordCharacters は、次の手順を実行します。

  1. 次の63文字を含む文字セットを A をとする
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    0 1 2 3 4 5 6 7 8 9 _
  2. empty セット を U とする
  3. Canonicalize(c) が、A内にあるが、cが、A内にないという条件を満たす全ての c について cU に追加する
  4. Assert: UnicodeIgnoreCase の両方が true でない限り、Uempty
  5. セット U の文字をセット A に追加する
  6. A を返す
21.2.2.6.2 ランタイムセマンティクス(Runtime Semantics): IsWordChar ( e )

抽象操作IsWordCharは、整数パラメーターeを受け取り、次の手順を実行します。

  1. e が -1 または eInputLength なら、 false を返す
  2. Input[e] を c とする
  3. ! WordCharacters() の結果を wordChars とする
  4. cwordChars 内にあるなら、 true を返す
  5. false を返す

21.2.2.7 Quantifier

次のプロダクションは、以下のアルゴリズムで評価します。

  1. QuantifierPrefix を評価して、整数 min と 整数(または∞)maxの2つの結果を取得する
  2. minmaxtrue の3つの結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. QuantifierPrefix を評価して、整数 min と 整数(または∞)maxの2つの結果を取得する
  2. minmaxfalse の3つの結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 2つの結果、0 と ∞ を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 2つの結果、 1 と ∞ を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 2つの結果、 0 and 1 を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. DecimalDigitsMV (11.8.3) を i とする
  2. 2つの結果、 ii を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. DecimalDigitsMVi とする
  2. 2つの結果、 i と ∞ を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 最初の DecimalDigitsMVi とする
  2. 2番目の DecimalDigitsMVj とする
  3. 2つの結果、 ij を返す

21.2.2.8 Atom

引数 direction を使用。

次のプロダクションは、以下のアルゴリズムで評価します。

  1. PatternCharacter にマッチする文字を ch とする
  2. 文字 ch を含む1要素の CharSetA とする
  3. CharacterSetMatcher(A, false, direction) をコールし、 結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Atom ::

.
  1. DotAlltrue なら、
    1. すべての文字のセットを A とする
  2. 1. でなければ、 LineTerminator を除くすべての文字のセットを A とする
  3. CharacterSetMatcher(A, false, direction) をコールし、 結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数 directionAtomEscape を評価した結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterClass を評価して、CharSet A とブール値 invert を取得する
  2. CharacterSetMatcher(A, invert, direction) をコールし、結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 引数directionを使用してDisjunction を評価し、Matcher mを取得する
  2. Atom の左側にある正規表現全体の左側をキャプチャする括弧の数を parenIndex とします。 これは、Atom の前またはそれを囲むAtom :: (GroupSpecifier Disjunction ) 解析ノードの総数
  3. directionmparenIndex をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xcdirectionparenIndex をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationd とする
      1. Assert: yState
      2. ycaptures リストのコピーを cap とする
      3. xendIndexxe とする
      4. yendIndexye とする
      5. direction が +1 と等しいなら、
        1. Assert: xeye
        2. 要素が Input のインデックス xe からye -1 までの文字である新しいリストを s とする
      6. v. と異なるなら、
        1. Assert: direction は -1 と等しい
        2. Assert: yexe
        3. 要素が Input のインデックス ye からxe -1 までの文字である新しいリストを s とする
      7. scap[parenIndex + 1] にセットする
      8. State値 (ye, cap) を z とする
      9. c(z) をコールし、その結果を返す
    4. m(x, d) をコールし、その結果を返す

次のプロダクションは、以下のアルゴリズムで評価します。

Atom ::

  1. 引数 directionDisjunction を評価した結果である Matcher を返す
21.2.2.8.1 ランタイムセマンティクス(Runtime Semantics): CharacterSetMatcher ( A, invert, direction )

抽象演算CharacterSetMatcherは、CharSet A、ブールフラグ invert、整数 directionの3つの引数を取り、次の手順を実行します。

  1. Ainvertdirection をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xendIndexe とする
    4. e + directionf とする
    5. f < 0 または fInputLength なら failure を返す
    6. min(e, f) を index とする
    7. 文字 Input[index] を ch とする
    8. Canonicalize(ch) を cc とする
    9. invertfalse なら、
      1. Canonicalize(a) が cc であるようなセット A のメンバー a が存在しないなら、failure を返す
    10. i. と異なるなら、
      1. Assert: inverttrue
      2. Canonicalize(a) が cc であるようなセット A のメンバー a が存在するなら、 failure を返す
    11. xcaptures リストを cap とする
    12. State値 (f, cap) を y とする
    13. c(y) をコールし、その結果を返す
21.2.2.8.2 ランタイムセマンティクス(Runtime Semantics): Canonicalize ( ch )

抽象操作Canonicalizeは、文字パラメーターchを受け取り、次のステップを実行します。

  1. IgnoreCasefalse なら、 ch を返す
  2. Unicodetrue なら、
    1. Unicode文字データベースのファイルCaseFolding.txtが、chの単純または一般的なケースフォールディングマッピングを提供するなら、そのマッピングを ch に適用した結果を返す
    2. ch を返す
  3. 2. と異なるなら、
    1. Assert: ch は UTF-16 コードユニット
    2. 単一のコードユニット ch で構成される文字列値を s とする
    3. this値として s を使用してString.prototype.toUpperCaseのアルゴリズムを実行したときと同じ結果を u とする
    4. Assert: Type(u) は String型
    5. uが単一のコードユニットで構成されていないなら、chを返す
    6. u の単一のコードユニット要素を cu とする
    7. chの数値 ≧ 128 で cuの数値 < 128 なら、chを返す
    8. cu を返す
形式(Disjunction) の括弧は、Disjunctionパターンのコンポーネントをグループ化することと、一致結果を保存することの両方の意味があります。 結果は、後方参照(\の後にゼロ以外の10進数が続く)で使用するか、置換文字列で参照するか、抽象クロージャと一致する正規表現から配列の一部として返すことができます。 括弧のキャプチャ動作を禁止するには、形式(?:Disjunction) を使用します。

形式 (?=Disjunction) は、ゼロ幅の正の先読みを指定します。 これが成功するためには、Disjunction内のパターンが現在の位置で一致する必要があります。ただし、現在の位置は後続と一致する前に進めることはできません。 Disjunctionが現在の位置で複数の方法により一致する場合、最初のものだけが試されます。 他の正規表現演算子とは異なり、(?= 形式へのバックトラックはありません(この異常な動作はPerlからの継承です)。これは、Disjunctionにキャプチャ括弧が含まれ、パターンの後続にそれらのキャプチャへの後方参照が含まれる場合にのみ問題になります。

例:

/(?=(a+))/.exec("baaabac")

上の例は、最初のbの直後の空の文字列と一致するため、次の配列を返します。

["", "aaa"]

先読みへのバックトラックの欠如を説明するために、以下を考慮してください。

/(?=(a+))a*b\1/.exec("baaabac")

上の例は、次の配列を返します。

["aba", "a"]

次のようにはなりません。

["aaaba", "a"]

フォーム(?!Disjunction)は、ゼロ幅の負の先読みを指定します。 これが成功するためには、Disjunction内のパターンが現在の位置で一致しない必要があります。 後続と一致する前に、現在の位置を進めることはできません。 Disjunctionにはキャプチャ括弧を含めることができます。ただし、それらへの後方参照はDisjunction自体の中からのみ意味があります。 パターンが成功するには負の先読みが失敗する必要があるため、パターンの他の場所からのこれらのキャプチャ括弧への逆参照は常にundefinedを返します。

例:

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

aの直後にない正の数nのa、a b、別のn a(最初の\ 2で指定)およびacを探します。 2番目の\ 2は負の先読みの外側にあるため、undefinedと一致します。そのため、常に成功します。 よって、式全体が次の配列を返します。

["baaabaac", "ba", undefined, "abaac"]

Unicodetrueで、大文字と小文字が区別されないマッチの場合、すべての文字は比較される直前にUnicode標準によって提供される単純なマッピングを使用して、暗黙的に大文字と小文字が区別されます。 単純なマッピングは常に単一のコードポイントにマッピングされるため、たとえば、ßU+00DF)はSSにマッピングされません。 ただし、基本ラテン語の範囲外のコードポイントを、たとえばſU+017F)からs内の文字にマップする場合があります。 Unicodefalseの場合、このような文字はマップされません。 これにより、U+017FU+212AなどのUnicodeコードポイントが/[a-z]/iなどの正規表現と一致しなくなりますが、/[a-z]/uiとは一致します。
21.2.2.8.3 ランタイムセマンティクス(Runtime Semantics): UnicodeMatchProperty ( p )

抽象操作UnicodeMatchPropertyは、Unicodeコードポイントのリストであるパラメーターpを受け取り、次の手順を実行します。

  1. Assert: Unicodeコードポイントのリストp は、表55または表56の「プロパティ名とエイリアス」列にリストされているUnicodeプロパティ名またはプロパティエイリアスと同一
  2. p に対応する「正規プロパティ名」列に示されているプロパティ名を c とする
  3. c のUnicodeコードポイントのリストを返す

実装は、表55表56にリストされているUnicodeプロパティ名およびエイリアスをサポートする必要があります。相互運用性を確保するために、実装は他のプロパティ名またはエイリアスをサポートしてはいけません。

たとえば、Script_Extensions(プロパティ名)とscx(プロパティエイリアス)は有効ですが、script_extensionsまたはScxは無効です。
リストされたプロパティは、UTS18RL1.2が必要とするスーパーセットを形成します。
表55: 非バイナリUnicodeプロパティエイリアスとその正規プロパティ名
プロパティ名とエイリアス 正規プロパティ名
General_Category
gc
General_Category
Script
sc
Script
Script_Extensions
scx
Script_Extensions
表56: バイナリUnicodeプロパティエイリアスとその正規プロパティ名
プロパティ名とエイリアス 正規プロパティ名
ASCII ASCII
ASCII_Hex_Digit
AHex
ASCII_Hex_Digit
Alphabetic
Alpha
Alphabetic
Any Any
Assigned Assigned
Bidi_Control
Bidi_C
Bidi_Control
Bidi_Mirrored
Bidi_M
Bidi_Mirrored
Case_Ignorable
CI
Case_Ignorable
Cased Cased
Changes_When_Casefolded
CWCF
Changes_When_Casefolded
Changes_When_Casemapped
CWCM
Changes_When_Casemapped
Changes_When_Lowercased
CWL
Changes_When_Lowercased
Changes_When_NFKC_Casefolded
CWKCF
Changes_When_NFKC_Casefolded
Changes_When_Titlecased
CWT
Changes_When_Titlecased
Changes_When_Uppercased
CWU
Changes_When_Uppercased
Dash Dash
Default_Ignorable_Code_Point
DI
Default_Ignorable_Code_Point
Deprecated
Dep
Deprecated
Diacritic
Dia
Diacritic
Emoji Emoji
Emoji_Component Emoji_Component
Emoji_Modifier Emoji_Modifier
Emoji_Modifier_Base Emoji_Modifier_Base
Emoji_Presentation Emoji_Presentation
Extended_Pictographic Extended_Pictographic
Extender
Ext
Extender
Grapheme_Base
Gr_Base
Grapheme_Base
Grapheme_Extend
Gr_Ext
Grapheme_Extend
Hex_Digit
Hex
Hex_Digit
IDS_Binary_Operator
IDSB
IDS_Binary_Operator
IDS_Trinary_Operator
IDST
IDS_Trinary_Operator
ID_Continue
IDC
ID_Continue
ID_Start
IDS
ID_Start
Ideographic
Ideo
Ideographic
Join_Control
Join_C
Join_Control
Logical_Order_Exception
LOE
Logical_Order_Exception
Lowercase
Lower
Lowercase
Math Math
Noncharacter_Code_Point
NChar
Noncharacter_Code_Point
Pattern_Syntax
Pat_Syn
Pattern_Syntax
Pattern_White_Space
Pat_WS
Pattern_White_Space
Quotation_Mark
QMark
Quotation_Mark
Radical Radical
Regional_Indicator
RI
Regional_Indicator
Sentence_Terminal
STerm
Sentence_Terminal
Soft_Dotted
SD
Soft_Dotted
Terminal_Punctuation
Term
Terminal_Punctuation
Unified_Ideograph
UIdeo
Unified_Ideograph
Uppercase
Upper
Uppercase
Variation_Selector
VS
Variation_Selector
White_Space
space
White_Space
XID_Continue
XIDC
XID_Continue
XID_Start
XIDS
XID_Start
21.2.2.8.4 ランタイムセマンティクス(Runtime Semantics): UnicodeMatchPropertyValue ( p, v )

抽象操作UnicodeMatchPropertyValueは、2つのUnicodeコードポイントのリストpvをパラメーターとして取り、次の手順を実行します。

  1. Assert: pは、表55の「正規プロパティ名」列にリストされているUnicodeコードポイントのリスト
  2. Assert: vは、表57または表58の「プロパティ値とエイリアス」列にリストされているUnicodeプロパティpのプロパティ値またはプロパティ値エイリアスと同一のUnicodeコードポイントのリスト
  3. vに対応する行の正規プロパティ値を value とする
  4. value のUnicode コードポイントリストを返す

実装は、表57および表58にリストされているUnicodeプロパティ値の名前とエイリアスをサポートする必要があります。相互運用性を確保するために、実装は他のプロパティ値の名前またはエイリアスをサポートしてはいけません。

たとえば、XpeoとOld_Persianは有効なScript_Extensions値ですが、xpeoとOld Persianはそうではありません。
このアルゴリズムは、UAX44にリストされている記号値の一致規則とは異なります。大文字と小文字、空白、U+002D(HYPHEN-MINUS)、およびU+005F(LOW LINE)は無視されず、Isプレフィックスはサポートされません。
表57: UnicodeプロパティGeneral_Categoryの値エイリアスと正規値
プロパティ値とエイリアス 正規のプロパティ値
Cased_Letter
LC
Cased_Letter
Close_Punctuation
Pe
Close_Punctuation
Connector_Punctuation
Pc
Connector_Punctuation
Control
Cc
cntrl
Control
Currency_Symbol
Sc
Currency_Symbol
Dash_Punctuation
Pd
Dash_Punctuation
Decimal_Number
Nd
digit
Decimal_Number
Enclosing_Mark
Me
Enclosing_Mark
Final_Punctuation
Pf
Final_Punctuation
Format
Cf
Format
Initial_Punctuation
Pi
Initial_Punctuation
Letter
L
Letter
Letter_Number
Nl
Letter_Number
Line_Separator
Zl
Line_Separator
Lowercase_Letter
Ll
Lowercase_Letter
Mark
M
Combining_Mark
Mark
Math_Symbol
Sm
Math_Symbol
Modifier_Letter
Lm
Modifier_Letter
Modifier_Symbol
Sk
Modifier_Symbol
Nonspacing_Mark
Mn
Nonspacing_Mark
Number
N
Number
Open_Punctuation
Ps
Open_Punctuation
Other
C
Other
Other_Letter
Lo
Other_Letter
Other_Number
No
Other_Number
Other_Punctuation
Po
Other_Punctuation
Other_Symbol
So
Other_Symbol
Paragraph_Separator
Zp
Paragraph_Separator
Private_Use
Co
Private_Use
Punctuation
P
punct
Punctuation
Separator
Z
Separator
Space_Separator
Zs
Space_Separator
Spacing_Mark
Mc
Spacing_Mark
Surrogate
Cs
Surrogate
Symbol
S
Symbol
Titlecase_Letter
Lt
Titlecase_Letter
Unassigned
Cn
Unassigned
Uppercase_Letter
Lu
Uppercase_Letter
表58: UnicodeプロパティScriptおよびScript_Extensionsの値エイリアスと正規値
プロパティ値とエイリアス 正規のプロパティ値
Adlam
Adlm
Adlam
Ahom
Ahom
Ahom
Anatolian_Hieroglyphs
Hluw
Anatolian_Hieroglyphs
Arabic
Arab
Arabic
Armenian
Armn
Armenian
Avestan
Avst
Avestan
Balinese
Bali
Balinese
Bamum
Bamu
Bamum
Bassa_Vah
Bass
Bassa_Vah
Batak
Batk
Batak
Bengali
Beng
Bengali
Bhaiksuki
Bhks
Bhaiksuki
Bopomofo
Bopo
Bopomofo
Brahmi
Brah
Brahmi
Braille
Brai
Braille
Buginese
Bugi
Buginese
Buhid
Buhd
Buhid
Canadian_Aboriginal
Cans
Canadian_Aboriginal
Carian
Cari
Carian
Caucasian_Albanian
Aghb
Caucasian_Albanian
Chakma
Cakm
Chakma
Cham
Cham
Cham
Cherokee
Cher
Cherokee
Common
Zyyy
Common
Coptic
Copt
Qaac
Coptic
Cuneiform
Xsux
Cuneiform
Cypriot
Cprt
Cypriot
Cyrillic
Cyrl
Cyrillic
Deseret
Dsrt
Deseret
Devanagari
Deva
Devanagari
Dogra
Dogr
Dogra
Duployan
Dupl
Duployan
Egyptian_Hieroglyphs
Egyp
Egyptian_Hieroglyphs
Elbasan
Elba
Elbasan
Elymaic
Elym
Elymaic
Ethiopic
Ethi
Ethiopic
Georgian
Geor
Georgian
Glagolitic
Glag
Glagolitic
Gothic
Goth
Gothic
Grantha
Gran
Grantha
Greek
Grek
Greek
Gujarati
Gujr
Gujarati
Gunjala_Gondi
Gong
Gunjala_Gondi
Gurmukhi
Guru
Gurmukhi
Han
Hani
Han
Hangul
Hang
Hangul
Hanifi_Rohingya
Rohg
Hanifi_Rohingya
Hanunoo
Hano
Hanunoo
Hatran
Hatr
Hatran
Hebrew
Hebr
Hebrew
Hiragana
Hira
Hiragana
Imperial_Aramaic
Armi
Imperial_Aramaic
Inherited
Zinh
Qaai
Inherited
Inscriptional_Pahlavi
Phli
Inscriptional_Pahlavi
Inscriptional_Parthian
Prti
Inscriptional_Parthian
Javanese
Java
Javanese
Kaithi
Kthi
Kaithi
Kannada
Knda
Kannada
Katakana
Kana
Katakana
Kayah_Li
Kali
Kayah_Li
Kharoshthi
Khar
Kharoshthi
Khmer
Khmr
Khmer
Khojki
Khoj
Khojki
Khudawadi
Sind
Khudawadi
Lao
Laoo
Lao
Latin
Latn
Latin
Lepcha
Lepc
Lepcha
Limbu
Limb
Limbu
Linear_A
Lina
Linear_A
Linear_B
Linb
Linear_B
Lisu
Lisu
Lisu
Lycian
Lyci
Lycian
Lydian
Lydi
Lydian
Mahajani
Mahj
Mahajani
Makasar
Maka
Makasar
Malayalam
Mlym
Malayalam
Mandaic
Mand
Mandaic
Manichaean
Mani
Manichaean
Marchen
Marc
Marchen
Medefaidrin
Medf
Medefaidrin
Masaram_Gondi
Gonm
Masaram_Gondi
Meetei_Mayek
Mtei
Meetei_Mayek
Mende_Kikakui
Mend
Mende_Kikakui
Meroitic_Cursive
Merc
Meroitic_Cursive
Meroitic_Hieroglyphs
Mero
Meroitic_Hieroglyphs
Miao
Plrd
Miao
Modi
Modi
Modi
Mongolian
Mong
Mongolian
Mro
Mroo
Mro
Multani
Mult
Multani
Myanmar
Mymr
Myanmar
Nabataean
Nbat
Nabataean
Nandinagari
Nand
Nandinagari
New_Tai_Lue
Talu
New_Tai_Lue
Newa
Newa
Newa
Nko
Nkoo
Nko
Nushu
Nshu
Nushu
Nyiakeng_Puachue_Hmong
Hmnp
Nyiakeng_Puachue_Hmong
Ogham
Ogam
Ogham
Ol_Chiki
Olck
Ol_Chiki
Old_Hungarian
Hung
Old_Hungarian
Old_Italic
Ital
Old_Italic
Old_North_Arabian
Narb
Old_North_Arabian
Old_Permic
Perm
Old_Permic
Old_Persian
Xpeo
Old_Persian
Old_Sogdian
Sogo
Old_Sogdian
Old_South_Arabian
Sarb
Old_South_Arabian
Old_Turkic
Orkh
Old_Turkic
Oriya
Orya
Oriya
Osage
Osge
Osage
Osmanya
Osma
Osmanya
Pahawh_Hmong
Hmng
Pahawh_Hmong
Palmyrene
Palm
Palmyrene
Pau_Cin_Hau
Pauc
Pau_Cin_Hau
Phags_Pa
Phag
Phags_Pa
Phoenician
Phnx
Phoenician
Psalter_Pahlavi
Phlp
Psalter_Pahlavi
Rejang
Rjng
Rejang
Runic
Runr
Runic
Samaritan
Samr
Samaritan
Saurashtra
Saur
Saurashtra
Sharada
Shrd
Sharada
Shavian
Shaw
Shavian
Siddham
Sidd
Siddham
SignWriting
Sgnw
SignWriting
Sinhala
Sinh
Sinhala
Sogdian
Sogd
Sogdian
Sora_Sompeng
Sora
Sora_Sompeng
Soyombo
Soyo
Soyombo
Sundanese
Sund
Sundanese
Syloti_Nagri
Sylo
Syloti_Nagri
Syriac
Syrc
Syriac
Tagalog
Tglg
Tagalog
Tagbanwa
Tagb
Tagbanwa
Tai_Le
Tale
Tai_Le
Tai_Tham
Lana
Tai_Tham
Tai_Viet
Tavt
Tai_Viet
Takri
Takr
Takri
Tamil
Taml
Tamil
Tangut
Tang
Tangut
Telugu
Telu
Telugu
Thaana
Thaa
Thaana
Thai
Thai
Thai
Tibetan
Tibt
Tibetan
Tifinagh
Tfng
Tifinagh
Tirhuta
Tirh
Tirhuta
Ugaritic
Ugar
Ugaritic
Vai
Vaii
Vai
Wancho
Wcho
Wancho
Warang_Citi
Wara
Warang_Citi
Yi
Yiii
Yi
Zanabazar_Square
Zanb
Zanabazar_Square

21.2.2.9 AtomEscape

引数 direction を使用。 The production

次のプロダクションは、以下のアルゴリズムで評価します。

  1. DecimalEscape を評価して整数 n を取得する
  2. Assert: nNcapturingParens
  3. BackreferenceMatcher(n, direction) をコールし、結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterEscape を評価し、文字 ch を取得する
  2. 文字 ch を含む1要素の CharSetA とする
  3. CharacterSetMatcher(A, false, direction) をコールし、結果の Matcher を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterClassEscape を評価し、 CharSet A を取得する
  2. CharacterSetMatcher(A, false, direction) をコールし、結果の Matcher を返す
\ の後にゼロ以外の10進数nが続くエスケープシーケンスは、n番目のキャプチャ括弧(21.2.2.1)と一致します。 正規表現のキャプチャ括弧がn個未満の場合は、エラーになります。 正規表現にn個以上のキャプチャ括弧があり、何もキャプチャしていないためにn番目の括弧がundefinedの場合、後方参照は常に成功します。

次のプロダクションは、以下のアルゴリズムで評価します。

次のように評価します。

  1. GroupNameに含まれるRegExpIdentifierNameStringValueと等しいStringValueを持つRegExpIdentifierNameGroupSpecifierのインスタンスを囲むパターンを検索する
  2. Assert:単一のGroupSpecifierが見つかった
  3. 配置されたGroupSpecifierの左側にある正規表現全体の左側をキャプチャする括弧の数を parenIndex とする。 これは、配置されたGroupSpecifierの前またはそれを囲む Atom :: (GroupSpecifier Disjunction ) 解析ノードの総数
  4. BackreferenceMatcher(parenIndex, direction) をコールし、 結果の Matcher を返す
21.2.2.9.1 ランタイムセマンティクス(Runtime Semantics): BackreferenceMatcher ( n, direction )

抽象操作BackreferenceMatcherは、整数nと整数directionの2つの引数を取り、次の手順を実行します。

  1. ndirection をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
    1. Assert: xState
    2. Assert: cContinuation
    3. xcaptures List を cap とする
    4. cap[n] を s とする
    5. sundefined なら、 c(x) を返す
    6. xendIndexe とする
    7. s の要素数を len とする
    8. e + direction × lenf とする
    9. f < 0 または fInputLength なら failure を返す
    10. min(e, f) を g とする
    11. i を0からlen-1までの整数としたとき、Canonicalize(s[i]) と Canonicalize(Input[g + i]) が同じ文字値にならないiが存在するなら、failure を返す
    12. State値 (f, cap) を y とする
    13. c(y) をコールし、その結果を返す

21.2.2.10 CharacterEscape

CharacterEscape プロダクションは、以下のアルゴリズムで評価します。

  1. CharacterEscapeCharacterValuecv とする
  2. 文字値がcvの文字を返す

21.2.2.11 DecimalEscape

DecimalEscape プロダクションは、以下のアルゴリズムで評価します。

  1. DecimalEscapeCapturingGroupNumber を返す
\の後に最初の桁が0ではない10進数nが続く場合、エスケープシーケンスは後方参照と見なされます。 nが正規表現全体の左角かっこの総数よりも大きい場合はエラーになります。

21.2.2.12 CharacterClassEscape

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 0から9までの文字を含む10要素の文字セットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterClassEscape :: dによって返されるセットに含まれていないすべての文字のセットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. WhiteSpace または LineTerminator プロダクションの右側にある文字を含む文字セットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterClassEscape :: s によって返されるセットに含まれていないすべての文字のセットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. WordCharacters() によって返されるすべての文字のセットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. CharacterClassEscape :: w によって返されるセットに含まれていないすべての文字セットを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. UnicodePropertyValueExpression によって返されるCharSetが持つすべてのUnicodeコードポイントを含むCharSetを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. UnicodePropertyValueExpression によって返されるCharSetに含まれていないすべてのUnicodeコードポイントを含むCharSetを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. UnicodePropertyNameSourceTextps とする
  2. ! UnicodeMatchProperty(ps) を p とする
  3. Assert: pは、表55の「プロパティ名とエイリアス」列にリストされているUnicodeプロパティ名またはプロパティエイリアス
  4. UnicodePropertyValueSourceTextvs とする
  5. ! UnicodeMatchPropertyValue(p, vs) を v とする
  6. 文字データベース定義に値vのプロパティpが含まれているすべてのUnicodeコードポイントを含むCharSetを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. LoneUnicodePropertyNameOrValueSourceTexts とする
  2. ! UnicodeMatchPropertyValue(General_Category, s) が、表57の「プロパティ値とエイリアス」列にリストされているUnicode一般カテゴリまたは一般カテゴリエイリアスの名前であるUnicodeコードポイントのリストと同一なら、
    1. 文字データベース定義に値sのプロパティ"General_Category"が含まれているすべてのUnicodeコードポイントを含むCharSetを返返す
  3. ! UnicodeMatchProperty(s) を p とする
  4. Assert: p は、表56の「プロパティ名とエイリアス」列にリストされているバイナリUnicodeプロパティまたはバイナリプロパティエイリアス
  5. 文字データベース定義に値"True"のプロパティpが含まれているすべてのUnicodeコードポイントを含むCharSetを返す

21.2.2.13 CharacterClass

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassRanges を評価し、 CharSet A を取得する
  2. 2つの結果 Afalse を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassRanges を評価し、 CharSet A を取得する
  2. 2つの結果 Atrue を返す

21.2.2.14 ClassRanges

次のプロダクションは、以下のアルゴリズムで評価します。

  1. empty CharSet を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. NonemptyClassRanges の評価結果である CharSet を返す

21.2.2.15 NonemptyClassRanges

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtom 評価した結果である CharSet を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtom 評価して、 CharSet A を取得する
  2. NonemptyClassRangesNoDash 評価して、 CharSet B を取得する
  3. A and B 和集合を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. 最初の ClassAtom 評価して、 CharSet A を取得する
  2. 2番目の ClassAtom 評価して、 CharSet B を取得する
  3. ClassRanges 評価して、 CharSet C を取得する
  4. CharacterRange(A, B) をコールし、結果の CharSetD とする
  5. DC 和集合を返す
21.2.2.15.1 ランタイムセマンティクス(Runtime Semantics): CharacterRange ( A, B )

抽象操作CharacterRangeは、2つのCharSetパラメーターAおよびBを取り、次の手順を実行します。

  1. Assert: AB は、それぞれ1文字だけが含まれている
  2. CharSet A の1文字を a とする
  3. CharSet B の1文字を b とする
  4. a の文字値を i とする
  5. b の文字値を j とする
  6. Assert: ij
  7. i から j までの番号が付けられたすべての文字を含むセットを返す

21.2.2.16 NonemptyClassRangesNoDash

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtom 評価した結果である CharSet を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtomNoDash 評価して、 CharSet A を取得する
  2. NonemptyClassRangesNoDash 評価して、 a CharSet B を取得する
  3. A and B の和集合を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtomNoDash 評価して、 a CharSet A を取得する
  2. ClassAtom 評価して、 CharSet B を取得する
  3. ClassRanges 評価して、 CharSet C を取得する
  4. CharacterRange(A, B) をコールし、 その結果の CharSetD とする
  5. DC の和集合を返す
ClassRangesは、ダッシュで区切られた単一のClassAtomおよび / または2つのClassAtomの範囲に展開できます。 後者の場合、ClassRangesには、最初のClassAtomと2番目のClassAtomの間のすべての文字が含まれます。 ClassAtomが単一の文字を表していない場合(たとえば、1つが\wの場合)、または最初のClassAtomの文字値が2番目のClassAtomの文字値より大きい場合はエラーが発生します。
パターンが大文字と小文字を区別しない場合でも、範囲の両端の大文字と小文字は、どの文字が範囲に属するかを決定する上で重要です。 したがって、たとえば、パターン /[E-F]/i は文字 EFef に一致し、パターン /[E-f]/i はUnicode基本ラテンブロックのすべての大文字と小文字に一致します。 記号 [\]^_` も同様です。
- 文字は文字通りに扱うことも、範囲を示すこともできます。 ClassRangesの最初または最後の文字、範囲指定の開始または終了制限であるか、範囲指定の直後である場合は、文字通りに扱われます。

21.2.2.17 ClassAtom

次のプロダクションは、以下のアルゴリズムで評価します。

ClassAtom ::

-
  1. 単一の文字 - U+002D (HYPHEN-MINUS)を含む CharSet をを返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassAtomNoDash 評価した結果である CharSet を返す

21.2.2.18 ClassAtomNoDash

次のプロダクションは、以下のアルゴリズムで評価します。

ClassAtomNoDash ::

SourceCharacter one of \ or ] or -
  1. SourceCharacter と一致する文字を含む CharSet を返す

次のプロダクションは、以下のアルゴリズムで評価します。

  1. ClassEscape 評価した結果である CharSet を返す

21.2.2.19 ClassEscape

ClassEscape プロダクションは、以下のアルゴリズムで評価します。

  1. ClassEscapeCharacterValuecv とする
  2. 文字値が cv の文字を c とする
  3. 単一の文字 c を含む CharSet を返す
  1. CharacterClassEscape 評価した結果である CharSet を返す
ClassAtomは、\b\B、および後方参照を除いて、正規表現の残りの部分で許可されている任意のエスケープシーケンスを使用できます。 CharacterClass内では、\bはバックスペース文字を意味し、\Bと後方参照はエラーを発生させます。 ClassAtom内で後方参照を使用すると、エラーが発生します。

21.2.3 RegExpコンストラクター(The RegExp Constructor)

RegExpコンストラクターは、次の特徴があります。

  • 組み込みオブジェクト%RegExp%です。
  • グローバルオブジェクト"RegExp"プロパティの初期値です。
  • コンストラクターとしてではなく関数として呼び出されたときに、新しいRegExpオブジェクトを作成して初期化します。 したがって、関数呼び出しRegExp(…)は、同じ引数を持つオブジェクト作成式new RegExp(…)と同等です。
  • サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、必要な内部スロットとサブクラスインスタンスを作成および初期化するために、RegExpコンストラクターへのsuperコールを含める必要があります。

21.2.3.1 RegExp ( pattern, flags )

次の手順が実行されます。

  1. ? IsRegExp(pattern) を patternIsRegExp とする
  2. NewTargetundefined なら、
    1. アクティブ関数オブジェクトnewTarget とする
    2. patternIsRegExptrue で、 flagsundefined なら、
      1. ? Get(pattern, "constructor") を patternConstructor とする
      2. SameValue(newTarget, patternConstructor) が true なら、 pattern を返す
  3. 2. と異なるなら、 NewTargetnewTarget とする
  4. Type(pattern) が Object型 で pattern が [[RegExpMatcher]] 内部スロットを持っているなら、
    1. pattern.[[OriginalSource]] を P とする
    2. flagsundefined なら、 pattern.[[OriginalFlags]] を F とする
    3. b. と異なるなら、 flagsF とする
  5. 4. と異なり、 patternIsRegExptrue なら、
    1. ? Get(pattern, "source") を P とする
    2. flagsundefined なら、
      1. ? Get(pattern, "flags") を F とする
    3. b. と異なるなら、 flagsF とする
  6. 5. と異なるなら、
    1. patternP とする
    2. flagsF とする
  7. ? RegExpAlloc(newTarget) を O とする
  8. ? RegExpInitialize(O, P, F) を返す
パターンがStringLiteralを使用して提供される場合、文字列がRegExpによって処理される前に、通常のエスケープシーケンス置換が実行されます。 パターンにRegExpで認識されるエスケープシーケンスが含まれている場合は、StringLiteralのコンテンツが形成されたときに削除されないように、U+005C(REVERSE SOLIDUS)コードポイントをStringLiteral内でエスケープする必要があります。

21.2.3.2 RegExpコンストラクターの抽象演算(Abstract Operations for the RegExp Constructor)

21.2.3.2.1 ランタイムセマンティクス(Runtime Semantics): RegExpAlloc ( newTarget )

引数newTargetを指定した抽象操作RegExpAllocが呼び出されると、次の手順が実行されます。

  1. ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[RegExpMatcher]], [[OriginalSource]], [[OriginalFlags]] ») を obj とする
  2. ! DefinePropertyOrThrow(obj, "lastIndex",プロパティ記述子 {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する
  3. obj を返す
21.2.3.2.2 ランタイムセマンティクス(Runtime Semantics): RegExpInitialize ( obj, pattern, flags )

引数objpattern、およびflagsを指定した抽象操作RegExpInitializeが呼び出されると、次の手順が実行されます。

  1. patternundefined なら、 empty String を P とする
  2. 1. と異なるなら、 ? ToString(pattern) を P とする
  3. flagsundefined なら、 empty String を F とする
  4. 3. と異なるなら、 ? ToString(flags) を F とする
  5. F"g""i""m""s""u""y" 以外のコードユニットが含まれている、または、同じコードユニットが複数回含まれているなら、 SyntaxError例外をスローする
  6. F"u" が含まれているなら false を、異なるなら trueBMP とする
  7. BMPtrue なら、
    1. P の16ビット要素のそれぞれをUnicode BMPコードポイントとして解釈したシーケンスを pText とする。UTF-16デコードは要素に適用しない
    2. 21.2.1の文法を使用して pText を解析する。 解析のゴールシンボルPattern[~U, ~N]とする。 解析の結果にGroupNameが含まれているなら、ゴールシンボル Pattern[~U, +N]を使用して再解析し、その結果を適用する。 pTextが文法に準拠していない、pTextのいずれかの要素が解析によって一致しない、または早期エラー条件が存在するなら、SyntaxError例外をスローする
    3. 要素が P のコードユニット要素であるリストを patternCharacters とする
  8. 7. と異なるなら、
    1. ! UTF16DecodeString(P) を pText とする
    2. 21.2.1の文法を使用してpTextを解析する。 解析のゴールシンボルPattern[+U, +N]とする。 pTextが文法に準拠していない、pTextのいずれかの要素が解析によって一致しない、または早期エラー条件が存在するなら、SyntaxError例外をスローする
    3. 要素が pText のコードポイントであるリストを patternCharacters とする
  9. Pobj.[[OriginalSource]] にセットする
  10. Fobj.[[OriginalFlags]] にセットする
  11. パターンのSourceCharacter値のリストとして patternCharacters を、フラグパラメータとして F を使用して、21.2.2のセマンティクスを適用し、上記の解析を評価する抽象クロージャ を obj.[[RegExpMatcher]] にセットする
  12. ? Set(obj, "lastIndex", 0, true) を実行する
  13. obj を返す
21.2.3.2.3 ランタイムセマンティクス(Runtime Semantics): RegExpCreate ( P, F )

引数PおよびFを指定した抽象操作RegExpCreateが呼び出されると、次の手順が実行されます。

  1. ? RegExpAlloc(%RegExp%) を obj とする
  2. ? RegExpInitialize(obj, P, F) を返す
21.2.3.2.4 ランタイムセマンティクス(Runtime Semantics): EscapeRegExpPattern ( P, F )

引数PおよびFを指定した抽象操作EscapeRegExpPatternが呼び出されると、次のようになります。

  1. UTF-16でエンコードされたUnicodeコードポイント(6.1.4)として解釈される P と同等の Pattern[~U]F"u"が含まれている場合はPattern[+U])の形式の文字列を S とする。 SP と同一でない場合もある。 ただし、SPattern[~U]F"u"が含まれている場合はPattern[+U])として評価した結果の抽象クロージャは、構築されたオブジェクトの[[RegExpMatcher]]内部スロットによって与えられる抽象クロージャと同じように動作する必要がある。PF に同じ値を使用してこの抽象操作を複数回呼び出すと、同じ結果が得られる必要がある
  2. パターンで発生するコードポイント / またはLineTerminatorは、構築された正規表現と同じように動作するRegularExpressionLiteralとして、適切な字句コンテキストで、"/"S"/"F の文字列連結を確実に解析できるように、必要に応じて S でエスケープする。たとえば、P"/" の場合、S は "\/" または "\u002F" などの可能性があるが、"/" ではない。なぜなら、///の後にFが続くと、RegularExpressionLiteralではなくSingleLineCommentとして解析されるため。P が空の文字列の場合、S"(?:)" にすることでこの仕様を満たすことができる
  3. S を返す

21.2.4 RegExpコンストラクターのプロパティ(Properties of the RegExp Constructor)

RegExpコンストラクターは、次の特徴があります。

  • [[Prototype]]内部スロットがあり、値は%Function.prototype%である
  • 以下のプロパティがある

21.2.4.1 RegExp.prototype

RegExp.prototypeの初期値は%RegExp.prototype%です。

このプロパティの属性は {[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。

21.2.4.2 get RegExp [ @@species ]

RegExp[@@ species]はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を返す

この関数の"name"プロパティの値は"get [Symbol.species]"です。

通常RegExpプロトタイプメソッドは、thisオブジェクトのコンストラクターを使用して派生オブジェクトを作成します。 ただし、サブクラスコンストラクターは、@@ speciesプロパティを再定義することでそのデフォルトの動作をオーバーライドできます。

21.2.5 RegExpプロトタイプオブジェクトのプロパティ(Properties of the RegExp Prototype Object)

RegExpプロトタイプオブジェクトは、次の特徴があります。

  • 組み込みオブジェクト%RegExpPrototype%です。
  • 通常のオブジェクトです。
  • RegExpインスタンスではありません。[[RegExpMatcher]]内部スロットや、RegExpインスタンスオブジェクトの他の内部スロットがありません。
  • [[Prototype]]内部スロットがあり、値が%Object.prototype%です。
RegExpプロトタイプオブジェクトには、独自の"valueOf"プロパティがありません。 ただし、Objectプロトタイプオブジェクトから"valueOf"プロパティを継承します。

21.2.5.1 RegExp.prototype.constructor

RegExp.prototype.constructorの初期値は%RegExp%です。

21.2.5.2 RegExp.prototype.exec ( string )

正規表現に対してstringの正規表現マッチを実行し、その結果を含むArrayオブジェクトを返します。stringがマッチしなかった場合は、nullを返します。

文字列ToString(string)は、次のように正規表現パターンの出現を検索します。

  1. this値 を R とする
  2. ? RequireInternalSlot(R, [[RegExpMatcher]]) を実行する
  3. ? ToString(string) を S とする
  4. ? RegExpBuiltinExec(R, S) を返す
21.2.5.2.1 ランタイムセマンティクス(Runtime Semantics): RegExpExec ( R, S )

引数RおよびSを指定した抽象操作RegExpExecは、次の手順を実行します。

  1. Assert: Type(R) は Object型
  2. Assert: Type(S) は String
  3. ? Get(R, "exec") を exec とする
  4. IsCallable(exec) が true なら、
    1. ? Call(exec, R, « S ») を result とする
    2. Type(result) が Object型 でも Null でもないなら、TypeError例外をスローする
    3. result を返す
  5. ? RequireInternalSlot(R, [[RegExpMatcher]]) を実行する
  6. ? RegExpBuiltinExec(R, S) を返す
呼び出し可能な "exec" プロパティが見つからない場合、このアルゴリズムは組み込みRegExpマッチングアルゴリズムの使用を試みるためにフォールバックします。 これにより、以前のエディション用に記述されたコードと互換性のある動作が提供されます。(以前は、正規表現を使用するほとんどの組み込みアルゴリズムが "exec"の動的プロパティルックアップを実行しなかった)
21.2.5.2.2 ランタイムセマンティクス(Runtime Semantics): RegExpBuiltinExec ( R, S )

引数RおよびSを指定した抽象操作RegExpBuiltinExec は、次の手順を実行します。

  1. Assert: R は初期化されたRegExpインスタンス
  2. Assert: Type(S) は String型
  3. S のコードユニット数を length とする
  4. ? ToLength(? Get(R, "lastIndex")) を lastIndex とする
  5. R.[[OriginalFlags]] を flags とする
  6. flags"g" が含まれているなら true を、異なるなら、 falseglobal とする
  7. flags"y" が含まれているなら true を、異なるなら、 falsesticky とする
  8. globalfalse で、 stickyfalse なら、 0 を lastIndex にセット
  9. R.[[RegExpMatcher]] を matcher とする
  10. If flags"u" が含まれているなら true を、異なるなら falsefullUnicode とする
  11. falsematchSucceeded とする
  12. matchSucceededfalse の間繰り返し
    1. lastIndexlength なら、
      1. globaltruestickytrue なら、
        1. ? Set(R, "lastIndex", 0, true) を実行する
      2. null を返す
    2. matcher(S, lastIndex) を r とする
    3. rfailure なら、
      1. stickytrue なら、
        1. ? Set(R, "lastIndex", 0, true) を実行する
        2. null を返す
      2. AdvanceStringIndex(S, lastIndex, fullUnicode) を lastIndex にセットする
    4. c. と異なるなら、
      1. Assert: rState
      2. truematchSucceeded にセットする
  13. rendIndex 値 を e とする
  14. fullUnicodetrue なら、
    1. matcherでマッチした S から派生した、Input文字リストへのインデックスを e とする。 Inputの要素eの文字に対応するSへの最小のインデックスを eUTF とする。 eInputの要素数以上なら、eUTFSのコードユニット数である
    2. eUTFe にセットする
  15. globaltruestickytrue なら、
    1. ? Set(R, "lastIndex", e, true) を実行する
  16. rcaptures リストの要素数を n とする (これは21.2.2.1NcapturingParensと同じ値)
  17. Assert: n < 232 - 1
  18. ! ArrayCreate(n + 1) を A とする
  19. Assert: A"length" プロパティの値は n + 1
  20. ! CreateDataPropertyOrThrow(A, "index", lastIndex) を実行する
  21. ! CreateDataPropertyOrThrow(A, "input", S) を実行する
  22. 一致した部分文字列を matchedSubstr とする(SのオフセットlastIndexからe-1までの部分)
  23. ! CreateDataPropertyOrThrow(A, "0", matchedSubstr) を実行する
  24. R GroupName のどれかを含んでいるなら、
    1. OrdinaryObjectCreate(null) を groups とする
  25. 24. と異なるなら、
    1. undefinedgroups とする
  26. ! CreateDataPropertyOrThrow(A, "groups", groups) を実行する
  27. i > 0 と in を満たす整数 i について、それぞれ次を処理する
    1. rcaptures リストの i番目の要素を captureI とする
    2. captureIundefined なら、 undefinedcapturedValue とする
    3. b. と異なり、 fullUnicodetrue なら、
      1. Assert: captureI は コードポイントのリスト
      2. ! UTF16Encode(captureI) を capturedValue とする
    4. c. と異なるなら、
      1. Assert: fullUnicodefalse
      2. Assert: captureI は コードユニットのリスト
      3. captureI のコードユニットで構成される文字列値を capturedValue とする
    5. ! CreateDataPropertyOrThrow(A, ! ToString(i), capturedValue) を実行する
    6. Ri番目のキャプチャ― が GroupName で定義されているなら、
      1. 対応する RegExpIdentifierNameStringValues とする
      2. ! CreateDataPropertyOrThrow(groups, s, capturedValue) を実行する
  28. A を返す
21.2.5.2.3 AdvanceStringIndex ( S, index, unicode )

引数Sindexunicodeを指定した抽象操作AdvanceStringIndexは、次の手順を実行します。

  1. Assert: Type(S) は String型
  2. Assert: 0 ≦ index ≦ 253 - 1 で ! IsInteger(index) は true
  3. Assert: Type(unicode) は Boolean型
  4. unicodefalse なら、 index + 1 を返す
  5. S のコードユニット数を length とする
  6. index + 1 ≧ length なら index + 1 を返す
  7. ! CodePointAt(S, index) を cp とする
  8. index + cp.[[CodeUnitCount]] を返す

21.2.5.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAll はsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を R とする
  2. Type(R) が Object型でないなら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags が コードユニット 0x0073 (LATIN SMALL LETTER S) を含んでいるなら true を返す
  6. false を返す

21.2.5.4 get RegExp.prototype.flags

RegExp.prototype.flagsはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) がObject型でないなら、TypeError例外をスローする
  3. empty String を result とする
  4. ! ToBoolean(? Get(R, "global")) を global とする
  5. globaltrue なら コードユニット 0x0067 (LATIN SMALL LETTER G) を result に追加する
  6. ! ToBoolean(? Get(R, "ignoreCase")) を ignoreCase とする
  7. ignoreCasetrue なら コードユニット 0x0069 (LATIN SMALL LETTER I) を result に追加する
  8. ! ToBoolean(? Get(R, "multiline")) を multiline とする
  9. multilinetrue なら コードユニット 0x006D (LATIN SMALL LETTER M) を result に追加する
  10. ! ToBoolean(? Get(R, "dotAll")) を dotAll とする
  11. dotAlltrue なら コードユニット 0x0073 (LATIN SMALL LETTER S) を result に追加する
  12. ! ToBoolean(? Get(R, "unicode")) を unicode とする
  13. unicode is true なら コードユニット 0x0075 (LATIN SMALL LETTER U) を result に追加する
  14. ! ToBoolean(? Get(R, "sticky")) を sticky とする
  15. stickytrue なら コードユニット 0x0079 (LATIN SMALL LETTER Y) を result に追加する
  16. result を返す

21.2.5.5 get RegExp.prototype.global

RegExp.prototype.globalはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) が Object型でない なら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags に コードユニット 0x0067 (LATIN SMALL LETTER G) が含まれているなら true を返す
  6. false を返す

21.2.5.6 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCaseはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) が Object型でない なら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags に コードユニット 0x0069 (LATIN SMALL LETTER I) が含まれているなら true を返す
  6. false を返す

21.2.5.7 RegExp.prototype [ @@match ] ( string )

@@match が引数 string で呼び出されると、次の手順が実行されます。

  1. this値 を rx とする
  2. Type(rx) が Object型でない なら、TypeError例外をスローする
  3. ? ToString(string) を S とする
  4. ! ToBoolean(? Get(rx, "global")) を global とする
  5. globalfalse なら、
    1. ? RegExpExec(rx, S) を返す
  6. 5. と異なるなら、
    1. Assert: globaltrue
    2. ! ToBoolean(? Get(rx, "unicode")) を fullUnicode とする
    3. ? Set(rx, "lastIndex", 0, true) を実行する
    4. ! ArrayCreate(0) を A とする
    5. 0 を n とする
    6. 繰り返す
      1. ? RegExpExec(rx, S) を result とする
      2. resultnull なら、
        1. n = 0 なら null を返す
        2. A を返す
      3. ii. と異なるなら、
        1. ? ToString(? Get(result, "0")) を matchStr とする
        2. ! CreateDataPropertyOrThrow(A, ! ToString(n), matchStr) を実行する
        3. matchStrempty String なら、
          1. ? ToLength(? Get(rx, "lastIndex")) を thisIndex とする
          2. AdvanceStringIndex(S, thisIndex, fullUnicode) を nextIndex とする
          3. ? Set(rx, "lastIndex", nextIndex, true) を実行する
        4. n + 1 を n にセットする

この関数の"name"プロパティの値は"[Symbol.match]"です。

@@matchプロパティは、正規表現の基本的な動作を持つオブジェクトを識別するためにIsRegExp抽象操作で使用します。 @@matchプロパティがないか、存在してもtrueとみなせない値を持っている場合は、そのオブジェクトは正規表現オブジェクトとして使用されることを意図していないことを示します。

21.2.5.8 RegExp.prototype [ @@matchAll ] ( string )

@@matchAll が引数 string で呼び出されると、次の手順が実行されます。

  1. this値 を R とする
  2. Type(R) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(string) を S とする
  4. ? SpeciesConstructor(R, %RegExp%) を C とする
  5. ? ToString(? Get(R, "flags")) を flags とする
  6. ? Construct(C, « R, flags ») を matcher とする
  7. ? ToLength(? Get(R, "lastIndex")) を lastIndex とする
  8. ? Set(matcher, "lastIndex", lastIndex, true) を実行する
  9. flags"g" を含んでいるなら trueglobal とする
  10. 9. と異なるなら、 falseglobal とする
  11. flags"u" を含んでいるなら truefullUnicode とする
  12. 11. と異なるなら、 falsefullUnicode とする
  13. ! CreateRegExpStringIterator(matcher, S, global, fullUnicode) を返す

この関数の"name"プロパティの値は"[Symbol.matchAll]"です。

21.2.5.8.1 CreateRegExpStringIterator ( R, S, global, fullUnicode )

抽象操作CreateRegExpStringIteratorは、イテレータオブジェクトを作成するために使用されます。 次の手順を実行します。

  1. Assert: Type(S) は String
  2. Assert: Type(global) は Boolean
  3. Assert: Type(fullUnicode) は Boolean
  4. OrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] ») を iterator とする
  5. Riterator.[[IteratingRegExp]] にセットする
  6. Siterator.[[IteratedString]] にセットする
  7. globaliterator.[[Global]] にセットする
  8. fullUnicodeiterator.[[Unicode]] にセットする
  9. falseiterator.[[Done]] にセットする
  10. iterator を返す

21.2.5.9 get RegExp.prototype.multiline

RegExp.prototype.multilineはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) が Object型でない なら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags に コードユニット 0x006D (LATIN SMALL LETTER M) が含まれているなら true を返す
  6. false を返す

21.2.5.10 RegExp.prototype [ @@replace ] ( string, replaceValue )

@@replaceメソッドが引数stringreplaceValueを使用して呼び出されると、次の手順が実行されます。

  1. this値 を rx とする
  2. Type(rx) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(string) を S とする
  4. コードユニット S の要素数を lengthS とする
  5. IsCallable(replaceValue) を functionalReplace とする
  6. functionalReplacefalse なら、
    1. ? ToString(replaceValue) を replaceValue にセットする
  7. ! ToBoolean(? Get(rx, "global")) を global とする
  8. globaltrue なら、
    1. ! ToBoolean(? Get(rx, "unicode")) を fullUnicode とする
    2. ? Set(rx, "lastIndex", 0, true) を実行する
  9. 空の新規Listresults とする
  10. falsedone とする
  11. donefalse の間繰り返し
    1. ? RegExpExec(rx, S) を result とする
    2. resultnull なら truedone にセットする
    3. b. と異なるなら、
      1. resultresults の最後に追加する
      2. globalfalse なら truedone にセットする
      3. ii. と異なるなら、
        1. ? ToString(? Get(result, "0")) を matchStr とする
        2. matchStrempty String なら、
          1. ? ToLength(? Get(rx, "lastIndex")) を thisIndex とする
          2. AdvanceStringIndex(S, thisIndex, fullUnicode) を nextIndex とする
          3. ? Set(rx, "lastIndex", nextIndex, true) を実行する
  12. empty String 値 を accumulatedResult とする
  13. 0 を nextSourcePosition とする
  14. results の 各要素を result とし、result ごとに次を実行する
    1. ? LengthOfArrayLike(result) を nCaptures とする
    2. max(nCaptures - 1, 0) を nCaptures にセットする
    3. ? ToString(? Get(result, "0")) を matched とする
    4. matched のコードユニット数を matchLength とする
    5. ? ToInteger(? Get(result, "index")) を position とする
    6. max( min(position, lengthS), 0) を position にセットする
    7. 1 を n とする
    8. 空の新規Listcaptures とする
    9. nnCaptures の間繰り返し
      1. ? Get(result, ! ToString(n)) を capN とする
      2. capNundefined でないなら、
        1. ? ToString(capN) を capN にセットする
      3. captures の最後に capN を追加する
      4. n + 1 を n にセットする
    10. ? Get(result, "groups") を namedCaptures とする
    11. functionalReplacetrue なら、
      1. « matched »replacerArgs とする
      2. captures の要素をリストの順序で replacerArgs の最後に追加する
      3. replacerArgspositionS を追加する
      4. namedCapturesundefined でないなら、
        1. namedCapturesreplacerArgs の最後に追加する
      5. ? Call(replaceValue, undefined, replacerArgs) を replValue とする
      6. ? ToString(replValue) を replacement とする
    12. k. と異なるなら、
      1. namedCapturesundefined でないなら、
        1. ? ToObject(namedCaptures) を namedCaptures にセットする
      2. ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue) を replacement とする
    13. positionnextSourcePosition なら、
      1. NOTE: 通常、positionは後方に移動しない。 そうでないなら、RegExpサブクラスの動作が正しくないか、アクセスによってトリガーされる副作用により、rxのグローバルフラグまたはその他の特性を変更していることを示している。 この場合、対応する置換は無視される
      2. accumulatedResult と SnextSourcePosition からposition -1 までのコードユニットで構成される文字列 と replacement の文字列連結を accumulatedResult にセットする
      3. position + matchLengthnextSourcePosition にセットする
  15. nextSourcePositionlengthS なら accumulatedResult を返す
  16. accumulatedResultSnextSourcePosition から最後までのコードユニットで構成される文字列の文字列連結を返す

この関数の"name"プロパティの値は"[Symbol.replace]"です。

21.2.5.11 RegExp.prototype [ @@search ] ( string )

@@search が引数 string で呼び出されると、次の手順が実行されます。

  1. this値 を rx とする
  2. Type(rx) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(string) を S とする
  4. ? Get(rx, "lastIndex") を previousLastIndex とする
  5. SameValue(previousLastIndex, 0) が false なら、
    1. ? Set(rx, "lastIndex", 0, true) を実行する
  6. ? RegExpExec(rx, S) を result とする
  7. ? Get(rx, "lastIndex") を currentLastIndex とする
  8. SameValue(currentLastIndex, previousLastIndex) が false なら、
    1. ? Set(rx, "lastIndex", previousLastIndex, true) を実行する
  9. resultnull なら、 -1 を返す
  10. ? Get(result, "index") を返す

この関数の"name"プロパティの値は"[Symbol.search]"です。

RegExpオブジェクトの"lastIndex"および"global"プロパティは、検索の実行時に無視されます。 "lastIndex"プロパティは変更されません。

21.2.5.12 get RegExp.prototype.source

RegExp.prototype.sourceはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値 を R とする
  2. Type(R) が Object型でないなら、TypeError例外をスローする
  3. R が [[OriginalSource]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 "(?:)" を返す
    2. TypeError例外をスローする
  4. Assert: R [[OriginalFlags]] 内部スロットがある
  5. R.[[OriginalSource]] を src とする
  6. R.[[OriginalFlags]] を flags とする
  7. EscapeRegExpPattern(src, flags) を返す

21.2.5.13 RegExp.prototype [ @@split ] ( string, limit )

stringを文字列に変換し、結果の部分文字列が格納されているArrayオブジェクトを返します。 部分文字列は、this値の正規表現の一致を左から右に検索することで決定されます。 一致部分は、返される配列に含まれませんが、文字列値を分割するために使用されます。

this値が空の正規表現または空の文字列の場合があります。このとき、正規表現は入力文字列の最初または最後の空の部分文字列と一致しません。また、直前に一致した区切り文字の最後の空の部分文字列とも一致しません。 (たとえば、正規表現が空の文字列の場合、文字列は個々のコードユニット要素に分割されます。結果の配列の長さは文字列の長さと等しく、各部分文字列には1つのコード単位が含まれます。)最初の一致のみ 文字列の特定のインデックスで、バックトラックがそのインデックスで空でない部分文字列の一致を生成する可能性がある場合でも考慮されます。 (たとえば、/a*?/[Symbol.split]("ab")は配列["a", "b"]と評価され、/a*/[Symbol.split]( "ab")は 配列["", "b"]と評価されます。)

stringが空の文字列の場合、結果は正規表現が空の文字列と一致するかどうかによって異なります。 可能であれば、結果の配列には要素が含まれていません。 それ以外の場合、結果の配列には空の文字列である1つの要素が含まれます。

正規表現にキャプチャー括弧が含まれている場合、separatorが一致するたびに、キャプチャー括弧の結果(undefinedの結果を含む)が出力配列にスプライスされます。

例:

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

上の例は、配列に評価されます。

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

limitundefinedでない場合、出力配列は切り捨てられ、limit個の要素のみが含まれるようになります。

@@split メソッドが呼び出されると、次の手順が実行されます。

  1. this値 を rx とする
  2. Type(rx) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(string) を S とする
  4. ? SpeciesConstructor(rx, %RegExp%) を C とする
  5. ? ToString(? Get(rx, "flags")) を flags とする
  6. flags"u" を含んでいるなら trueunicodeMatching とする
  7. 6. と異なるなら、 falseunicodeMatching とする
  8. Iflags"y" を含んでいるなら flagsnewFlags とする
  9. 8. と異なるなら、 flags"y" の文字列連結を newFlags とする
  10. ? Construct(C, « rx, newFlags ») を splitter とする
  11. ! ArrayCreate(0) を A とする
  12. 0 を lengthA とする
  13. limitundefined なら、 232 - 1 を、異なるなら ? ToUint32(limit) を lim とする
  14. S の長さを size とする
  15. 0 を p とする
  16. lim = 0 なら A を返す
  17. size = 0 なら、
    1. ? RegExpExec(splitter, S) を z とする
    2. znull でないなら、 A を返す
    3. ! CreateDataPropertyOrThrow(A, "0", S) を実行する
    4. A を返す
  18. pq とする
  19. qsize の間繰り返し
    1. ? Set(splitter, "lastIndex", q, true) を実行する
    2. ? RegExpExec(splitter, S) を z とする
    3. znull なら AdvanceStringIndex(S, q, unicodeMatching) を q にセットする
    4. c. と異なるなら、
      1. ? ToLength(? Get(splitter, "lastIndex")) を e とする
      2. min(e, size) を e にセットする
      3. e = p なら AdvanceStringIndex(S, q, unicodeMatching) を q にセットする
      4. iii. と異なるなら、
        1. S のインデックスpから q - 1 までのコードユニットで構成される文字列に等しい文字列値を T とする
        2. ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
        3. lengthA + 1 を lengthA にセットする
        4. lengthA = lim なら A を返す
        5. ep にセットする
        6. ? LengthOfArrayLike(z) を numberOfCaptures とする
        7. max(numberOfCaptures - 1, 0) を numberOfCaptures にセットする
        8. 1 を i とする
        9. inumberOfCaptures の間繰り返し
          1. ? Get(z, ! ToString(i)) を nextCapture とする
          2. ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), nextCapture) を実行する
          3. i + 1 を i にセットする
          4. lengthA + 1 を lengthA にセットする
          5. lengthA = lim なら A を返す
        10. pq にセットする
  20. S のインデックス p から size -1 までのコードユニットで構成される文字列に等しい文字列値を T とする
  21. ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
  22. A を返す

この関数の"name"プロパティの値は"[Symbol.split]"です。

@@splitメソッドは、RegExpオブジェクトの"global"プロパティと"sticky"プロパティの値を無視します。

21.2.5.14 get RegExp.prototype.sticky

RegExp.prototype.stickyはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) が Object型でない なら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags に コードユニット 0x0079 (LATIN SMALL LETTER Y) が含まれているなら true を返す
  6. false を返す

21.2.5.15 RegExp.prototype.test ( S )

次の手順が実行されます。

  1. this値 を R とする
  2. Type(R) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(S) を string とする
  4. ? RegExpExec(R, string) を match とする
  5. matchnull でないなら、 true を、異なるなら false を返す

21.2.5.16 RegExp.prototype.toString ( )

  1. this値 を R とする
  2. Type(R) が Object型でないなら、TypeError例外をスローする
  3. ? ToString(? Get(R, "source")) を pattern とする
  4. ? ToString(? Get(R, "flags")) を flags とする
  5. "/"pattern"/"flags の文字列連結を result とする
  6. result を返す
返される文字列は、thisオブジェクトと同じ動作を持つ別のRegExpオブジェクトに評価されるRegularExpressionLiteral形式です。

21.2.5.17 get RegExp.prototype.unicode

RegExp.prototype.unicodeはsetアクセス関数がundefinedアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。

  1. this値を R とする
  2. Type(R) が Object型でない なら、TypeError例外をスローする
  3. R が [[OriginalFlags]] 内部スロットを持っていないなら、
    1. SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
    2. TypeError例外をスローする
  4. R.[[OriginalFlags]] を flags とする
  5. flags に コードユニット 0x0075 (LATIN SMALL LETTER U) が含まれているなら true を返す
  6. false を返す

21.2.6 RegExpインスタンスのプロパティ(Properties of RegExp Instances)

RegExpインスタンスは、RegExpプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。RegExpインスタンスには、内部スロット[[RegExpMatcher]]、[[OriginalSource]]、および[[OriginalFlags]]があります。[[RegExpMatcher]]内部スロットの値は、RegExpオブジェクトのPattern抽象クロージャです。

ECMAScript 2015より前は、RegExpインスタンスは、独自のデータプロパティ"source""global""ignoreCase"、 "multiline"を持っていました。 これらのプロパティは、RegExp.prototypeのアクセサプロパティとして指定されるようになりました。

RegExpインスタンスには、以下のプロパティがあります。

21.2.6.1 lastIndex

"lastIndex"プロパティの値は、次にマッチを開始する文字列インデックスです。 使用すると整数に強制変換されます(21.2.5.2.2を参照)。 このプロパティの属性は、{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:false}です。

21.2.7 RegExp文字列イテレータオブジェクト(RegExp String Iterator Objects)

RegExp文字列イテレータはオブジェクトで、特定のStringインスタンスオブジェクトに対する特定の反復を表し、特定のRegExpインスタンスオブジェクトと照合します。RegExp文字列イテレータオブジェクトには名前付きコンストラクターがありません。代わりに、RegExpインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。

21.2.7.1 %RegExpStringIteratorPrototype%オブジェクト(The %RegExpStringIteratorPrototype% Object)

%RegExpStringIteratorPrototype%オブジェクトは、次の特徴があります。

  • すべてのRegExp文字列イテレータオブジェクトに継承されるプロパティがあります。
  • 通常のオブジェクトです。
  • [[Prototype]]内部スロットがあり、その値は組み込みオブジェクト%IteratorPrototype% です。
  • 以下のプロパティがあります。
21.2.7.1.1 %RegExpStringIteratorPrototype%.next ( )
  1. this値 を O とする
  2. Type(O) が Object型でないなら、TypeError例外をスローする
  3. O がRegExp文字列イテレータオブジェクトインスタンスの内部スロット(21.2.7.2)を持っていないなら TypeError例外をスローする
  4. O.[[Done]] が true なら、
    1. ! CreateIterResultObject(undefined, true) を返す
  5. O.[[IteratingRegExp]] を R とする
  6. O.[[IteratedString]] を S とする
  7. O.[[Global]] を global とする
  8. O.[[Unicode]] を fullUnicode とする
  9. ? RegExpExec(R, S) を match とする
  10. matchnull なら、
    1. trueO.[[Done]] にセットする
    2. ! CreateIterResultObject(undefined, true) を返す
  11. 10. と異なるなら、
    1. globaltrue なら、
      1. ? ToString(? Get(match, "0")) を matchStr とする
      2. matchStrempty String なら、
        1. ? ToLength(? Get(R, "lastIndex")) を thisIndex とする
        2. ! AdvanceStringIndex(S, thisIndex, fullUnicode) を nextIndex とする
        3. ? Set(R, "lastIndex", nextIndex, true) を実行する
      3. ! CreateIterResultObject(match, false) を返す
    2. a. と異なるなら、
      1. trueO.[[Done]] にセットする
      2. ! CreateIterResultObject(match, false) を返す
21.2.7.1.2 %RegExpStringIteratorPrototype% [ @@toStringTag ]

@@toStringTagプロパティの初期値は、文字列値"RegExpStringIterator"です。

このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}です。

21.2.7.2 RegExp文字列イテレータインスタンスのプロパティ(Properties of RegExp String Iterator Instances)

RegExp文字列イテレータインスタンスは、%RegExpStringIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。 RegExp文字列イテレータインスタンスは、最初に表59にリストされている内部スロットが作成されます。

表59: RegExp文字列イテレータインスタンスの内部スロット
内部スロット 内容
[[IteratingRegExp]] 反復に使用される正規表現。 IsRegExp([[IteratingRegExp]])は最初はtrueです。
[[IteratedString]] 繰り返される文字列値。
[[Global]] [[IteratingRegExp]]がグローバルかどうかを示すブール値。
[[Unicode]] [[IteratingRegExp]]がUnicodeモードであるかどうかを示すブール値。
[[Done]] 反復が完了したかどうかを示すブール値。